最近在学习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里面
Listlist = 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需求拿出来是绿色的 :
ListgreenList = 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 的作用就是我们只需要告诉他而不是告诉他做什么,这就是函数式编程的作用.