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<Apple> 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<Apple> greenList = list.stream().filter(a -> a.getColor().equals("green")).collect(Collectors.toList());

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

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

private static Map<String, List<Apple>> getAppleByOne(List<Apple> apples) {
    Map<String, List<Apple>> map = new HashMap<>();//先new一个map对象
    for (Apple a : apples) { //循环得到 apples 里面的每一个对象
        List<Apple> 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<String,List<Apple>> getByOptioal(List<Apple> apples){
    Map<String, List<Apple>> map = new HashMap<>();
    apples.stream().forEach((Apple a) -> {  //这里用到的Optional,就不用判断他里面的null了
        List<Apple> list1 = Optional.ofNullable(map.get(a.getColor())).orElseGet(() -> {
            List<Apple> 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<String,List<Apple>> getBycollection(List<Apple> 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 的作用就是我们只需要告诉他而不是告诉他做什么,这就是函数式编程的作用.




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值