JAVA8 : lambda和Stream 详解

最近出了jdk10; 可是连 java8 都用的不熟练 ; 这边简单介绍一下 java 8 中;我觉得比较有意思的lambda 表达式和流操作。

前期准备 :

public class Man {
    private String id;
    private String name;
    private List<Card> cards;
    //省略get /set
    }
public class Card {
    private String name;
    private String cardId;
    }
    //省略get /set
  List<Man> mans = new ArrayList<>();
        mans.add(new Man("002","李四",Arrays.asList(new Card("招商银行","6225800002"),new Card("建设银行","6227035248"))));
        mans.add(new Man("003","王五",Arrays.asList(new Card("建设银行","6227056547"),new Card("中国银行","6013832547"),new Card("民生银行","4074058542"))));
        mans.add(new Man("004","赵六",Arrays.asList(new Card("工商银行","9558832458"),new Card("工商银行","9558832547"),new Card("建设银行","6227032578"))));
        mans.add(new Man("005","孙七",Arrays.asList(new Card("中国银行","6013825847"),new Card("农业银行","6228836547"),new Card("招商银行","6225014582"))));
        mans.add(new Man("006","张三",Arrays.asList(new Card("工商银行","9558832587"),new Card("交通银行","6222814578"),new Card("工商银行","9558865427"))));
        mans.add(new Man("007","张三",Arrays.asList(new Card("招商银行","1158832587"),new Card("交通银行","6344814578"),new Card("工商银行","2131133133"))));

需求1 : 打印所有客户的名字

以前我们想要遍历这个list ; 应该怎么做呢? foreach 循环? iterator ?
现在有了 java 8 的lambda 表达式

  mans.forEach(  man->{ System.out.println(man.getName()); });

只要一行代码 ;就能实现遍历操作; 是不是很简单?
以上其实就是lambda 表达式 的写法;

需求2 : 获得所有客户名字的 list 集合

我们刚才打印了一下客户的名字; 现在是不是在循环外面创建一个集合 ; 把客户名字存进去就行了呢? 可以! 但这不是java 8的做法; java8的做法是流操作:

List<String> collect = mans.stream().map(man -> man.getName()).collect(Collectors.toList());

其实也是一行代码 ;但是可能不方便大家浏览 ;我把上面的代码分行:

List<String> nameList = mans.stream()
                            .map(man -> man.getName())
                            .collect(Collectors.toList());

这边的.stream() 就是把集合变成流来处理 ; .map() 就是说要重新创建一个集合 ;
collect 就是指定新创建集合的 形式; 是不是很灵活方便?

需求3 : 获取名字是张三的客户:

以前我们肯定是循环判断 ;java 8 也不例外;但是表达方式更加简单:

List<Man> collect = mans.stream().filter(m -> "张三".equals(m.getName())).collect(Collectors.toList());

因为这边名字是张三的客户可能是个集合; 所以这边返回值是list

需求4: 返回客户id 是007的 对象:

那么这个时候需要返回一个man 对象;应该怎么操作呢:

Man man = mans.stream().filter(m -> "007".equals(m.getId()))
    .findFirst().orElse(null);

流操作就是一步步点下去 ;取出你想要的数据;

需求5: 获得名字为 “张三” 客户的 银行卡 cards 集合

List<Card> cardList = mans.stream().filter(m -> "张三".equals(m.getName()))
    .flatMap(m -> m.getCards().stream())
    .collect(Collectors.toList());

这边大概分了3步:
第一步: filter 取得名字为张三 的 man的集合; 然后用flatMap去获得Card 流 ; 最后用collect 构建了 cardList .

这边用了新的API:flatMap : 在原有流的基础上;取得子集.

需求5更明显的展示了 lambda 表达式和Stream 的特性; 简单;灵活; 可读性高 .

需求6 :循环遍历一个双列集合:

刚才我们一直在处理单列集合; 那么双列集合该如何操作呢?我这边演示一下基本操作 ; 具体不做详解:

 HashMap<Object, Object> map = new HashMap<>();
        map.put("123","223");
        map.put("1223","223");
        map.put("1323","223");
   map.forEach((x,y) -> {
            System.out.println(x+":"+y);
        });

我们可以看到 java 8 的流操作和 lambda 表达式 ,的确一定意义上 , 不仅减少了我们的代码量 ; 而且还让我们的代码变得更加可读; 除了这边介绍的新特性 ; java8 还丰富了原来晦涩难懂的 时间Api ; 还提出了双冒号的用法;等各种方便的特性; 这边不做详解了 . 大家可以踊跃留言并且交流哦 !

还等什么? 把这些特性运用到你的 代码中吧!

猜你喜欢

转载自blog.csdn.net/qq_14853889/article/details/79777870