java8之Collector分组

最近在学习java8的collector特意做个小笔记: 

假设里面有一个Apple实体类里面的属性分别是 颜色:

public class Apple {

    private String color;
    private long weight;

    public Apple() {
    }

    public Apple(String color, long weight) {
        this.color = color;
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public long getWeight() {
        return weight;
    }

    public void setWeight(long weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "color='" + color + '\'' +
                ", weight=" + weight +
                '}';
    }
}
 
  

现在我们先把他实例化一下并把他存到list里面

List list = Arrays.asList(new Apple("green", 150)
        , new Apple("yellow", 120)
        , new Apple("green", 170)
        , new Apple("green", 150)
        , new Apple("yellow", 120)
        , new Apple("green", 170));

先熟悉一下java8的表达式:

1需求拿出来是绿色的 :

List greenList = list.stream().filter(a -> a.getColor().equals("green")).collect(Collectors.toList());

根据这个表达式我们通过filter过滤出来是绿色苹果的

2那么需求来了我们通过颜色对里面的元素进行分组,首先我们先到的思路就是 map 吧颜色作为一个key 值作为value 也就是list:

private static Map, List> getAppleByOne(List apples) {
    Map, List> map = new HashMap<>();//先new一个map对象
    for (Apple a : apples) { //循环得到 apples 里面的每一个对象
        List list = map.get(a.getColor()); //通过.getcolor去判断里面有没有对象
        if (list == null) { //判断如果没有获取到
            list = new ArrayList<>();//把它当做值
            map.put(a.getColor(), list); //把颜色作为key ,
        }
        list.add(a); //添加元素进去
    }
    return map;
}

好了,这是我们最普通的方法,那么我们用java8中的lambda的方式怎么写呢?

private  static  Map,List> getByOptioal(List apples){
    Map, List> map = new HashMap<>();
    apples.stream().forEach((Apple a) -> {  //这里用到的Optional,就不用判断他里面的null了
        List list1 = Optional.ofNullable(map.get(a.getColor())).orElseGet(() -> {
            List list = new ArrayList<>();  //思路跟里面的一样 都是先获取key 
            map.put(a.getColor(), list); 
            return list; //这里为什么要返回一个list呢?看下图
        });
        list1.add(a);
    });
    //final
    return  map;
}
 
  
 
  

因为里面要一个list所以返回回去,


这里我们看到我们用lambda 的方式并且用到了Optional, 省去了对他的判断但是问题来了,这样还不够简便啊!!!!!!

这时候我们就用到了j8的一个api, collector

private  static  Map,List> getBycollection(List apples){
    return  apples.stream().collect(Collectors.groupingBy(Apple::getColor));
}

好了这就我们最终的版本,什么?不信?来给你运行一下下:用里面的静态方法

//根据颜色进行分组 ,map 颜色做为一个key ,value 是结果
Optional.ofNullable(greenList).ifPresent(System.out::println);
Optional.ofNullable(getAppleByOne(list)).ifPresent(System.out::println);
System.out.println("===================================================");
Optional.ofNullable(getByOptioal(list)).ifPresent(System.out::println);
System.out.println("===================================================");
Optional.ofNullable(getBycollection(list)).ifPresent(System.out::println);


我们看到结果都一样啊,

结束并思考:java8 的作用就是我们只需要告诉他而不是告诉他做什么,这就是函数式编程的作用.




你可能感兴趣的:(java8,JAVA8,相关笔记)