专栏首页程序员备忘录枚举和List的几个共有方法

枚举和List的几个共有方法

1.如何判断一个值在枚举的元素中?

有时候我们需要判断一下一个值是否包含在一个枚举类型中,然后根据判断进行下一步操作。那么如何实现枚举类型的包含判断,而且能够像工具类一般的存在。所以我决定用反射来实现枚举类型的包含操作。但是唯一不足的地方是我们的method限定在getValue,也就是我们的枚举类的值必然要有一个value的值以及get、set方法。你还有什么更好的意见吗?有的话请留言,谢谢。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Author: tianjingle
 * @Date: 2019/8/14 17:26
 */
public class EnumUtil {

    public static boolean isContrain(Class clazz,int type) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Object[] objs = clazz.getEnumConstants();
        Method getValue=clazz.getMethod("getValue");
        boolean flag=false;
        for (Object vo:objs) {
            if (getValue.invoke(vo).equals(type)){
                flag=true;
                break;
            }else {
                continue;
            }
        }
        return flag;
    }
}

2.List如何去重?

我们知道HashSet除了在元素的存储上是无序的以外,还是不能够存储重复的元素。

HashSet如何判断元素是否重复呢?是根据元素继承的两个方法来判断,hashCode和equals,当存储元素时,首先判断要存入的元素和已存在的元素的哈希值是否相同,若不相同存入,若相同则利用equals判断两个元素是否相同,若不相同,则存入,若相同则放弃。而hashCode和equlas是在存入元素自动调用的。

所以我们第一想到的是将list转化为hashSet,然后将hashSet转回来。就可以实现List的去重。

    /**
     * list<string>去重
     * @param list
     * @return
     */
    public List removeDuplicate(List list) {
        HashSet h = new HashSet(list);
        list.clear();
        list.addAll(h);
        return list;
    }

3.List如何筛选?

查找了很长时间,发现java8的特性是函数式编程,目前还不太懂。但我觉得应该是像建造者模式那种。在java8中提供了流技术,而流技术能够解决这个问题。具体流技术的原理可以看这篇文章:https://www.cnblogs.com/CarpenterLee/p/6637118.html

现在可以尝试写一下使用stream来筛选list。

定义Student

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    private String name;

    private int stuNum;

    private int age;
}
public class TestStream {

    /**
     * @Description 创建四个学生对象并设值,保存在list集合中,模拟数据
     * @author 刘鹏博
     * @return List<Student>
     */
    public static List<Student> stuList() {
        List<Student> stuList = new ArrayList<Student>();
        Student stu1 = new Student();
        stu1.setStuNum(20180823);
        stu1.setName("张三");
        stu1.setAge(20);
        stuList.add(stu1);

        Student stu2 = new Student();
        stu2.setStuNum(20180824);
        stu2.setName("李四");
        stu2.setAge(21);
        stuList.add(stu2);

        Student stu3 = new Student();
        stu3.setStuNum(20180825);
        stu3.setName("王二");
        stu3.setAge(21);
        stuList.add(stu3);

        Student stu4 = new Student();
        stu4.setStuNum(20180826);
        stu4.setName("张五");
        stu4.setAge(22);
        stuList.add(stu4);
        return stuList;
    }

    public static void main(String[] args) {

        System.out.println(LitSourceType.Unknown);
        List<Student> stuList = stuList();

        // JDK1.8提供了lambda表达式, 可以从stuList中过滤出符合条件的结果。
        // 定义结果集
        List<Student> result = null;
        result = stuList.stream()
                .filter((Student s) -> s.getAge()==21)
                .collect(Collectors.toList());

        // 打印原有stuList集合中的数据
        System.out.println("原有stuList集合中的数据");
        stuList.forEach((Student s) -> System.out.println(s.getName() + "--->" + s.getAge()));

        // 打印过滤筛选后的result结果
        System.out.println("过滤筛选后的result结果");
        result.forEach((Student s) -> System.out.println(s.getName() + "--->" + s.getAge()));
    }

}

这里我们筛选了21岁的同学。

至于stream的原理,很重要。

本文分享自微信公众号 - 程序员备忘录(gh_a84f9a607848),作者:tianjl

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mysql学习笔记(十三)查看mysql日志

    有时候需要查看一下二进制的日志文件,也就是binlog日志,那么这些命令都是怎么样的呐,作者通过摸索。探讨了一下,总体如下:

    程序员_备忘录
  • SpringBoot源码学习(十四)- 动态bean注册

    在看源码的时候,我们发现了一个接口ImportBeanDefinitionRegistrar,当时只是简单的了解了一下spring的大概,没有做复习。在我们开始...

    程序员_备忘录
  • CountDownLatch源码解析

    CountDownLatch看着字面意思根本不知道这个类的大概作用是什么。。通过查阅相关资料,得出的结论是这个类能够让当前线程在其他线程都执行完毕之后再执行。那...

    程序员_备忘录
  • [javaSE] 集合框架(TreeSet)

    TreeSet:可以对Set集合中的元素排序,默认按照ascii表排序,二叉树结构

    陶士涵
  • Java基础-11总结Eclipse使用,API,Object类

    1:Eclipse的概述使用(掌握) 1:Eclipse的安装 2:用Eclipse写一个HelloWorld案例,最终在控制台输出你的名字 A:创建项目 ...

    Java帮帮
  • Java 学习笔记(4)——面向对象

    现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当...

    Masimaro
  • Java中如何使某个类的对象唯一性,只能创建一个对象

    private static Student s = new Student();

    用户7886150
  • sort

    func (p IntSlice) Less(i, j int) bool i对应的值是否小于j对应的值

    酷走天涯
  • IBM提出认知存储技术概念

    IBM研究院的科学家Giovanni Cherubini、Jens Jelitto和Vinodh Venkatesan在2016年4月4日出版的IEEE《计算机...

    人工智能快报
  • tensorflow图像裁剪进行数据增强操作

    当我们训练一个较为复杂的网络,并且我们的训练数据集有限时,网络十分容易陷入过拟合的状态。

    砸漏

扫码关注云+社区

领取腾讯云代金券