最近出了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 ; 还提出了双冒号的用法;等各种方便的特性; 这边不做详解了 . 大家可以踊跃留言并且交流哦 !
还等什么? 把这些特性运用到你的 代码中吧!