神奇的 stream 与它的好兄弟 collector

对平平常常的事物表示惊奇。

流,是个很酷的字眼。输入流输出流,字符流字节流,心流。Stream, flow, whatever. 想象飓风把一切吹进了长长的管道,从另一头出来时,它们全都分门别类堆放整齐。stream 是破坏者,collector 是强迫症。

引狼入室:

import java.util.stream.Collectors;

如果你有一个 list of entity,想把某个属性取出来集中存放:

List nameList = personEntityList.stream().map( a -> a.getName() ).collect( Collectors.toList() );

可以操纵它们,比如拼接:

List nameAgeList = personEntityList.stream().map( a -> (a.getName() + ":" + a.getAge() ) ).collect( Collectors.toList() );

说到这里好像都是 map() 的功劳。

还可以按某属性分组,得到一个 map,key 是用来分组的属性,value 是具备这个属性的对象列表。按性别分组,用神奇的双帽号获取属性:

Map> map = personEntityList.stream().collect( Collectors.groupingBy( PersonEntity :: getGender ) );

toMap() with merge function!key 冲突时,保留前一个,舍弃后一个:( k1, k2 ) -> k1,得到 map。

// 所以一个城市只能有一个代表啦
Map map = personEntityList.stream().collect( Collectors.toMap( PersonEntity :: getCity, a -> a, ( k1, k2 ) -> k1 ) );

或者不用 a -> a,用 Function.identity() 得到本尊:

Map map = personEntityList.stream().collect( Collectors.toMap(PersonEntity :: getPhone, Function.identity() ) );

定制你的 map,只把对应的 ID 和手机号取回来:

Map map = personEntityList.stream().collect( Collectors.toMap(PersonEntity :: getId, PersonEntity :: getPhone ) );

string to list to string 就为了与众不同 distinct():

String ageStr = StringUtils.join( Arrays.asList( ageStr ).stream().distinct().collect( Collectors.toList() ), ",");

后来发现用 Collectors.joining() 就好了:

String phoneStr = personEntityList.stream().map( a -> a.getPhone() ).collect(Collectors.joining(",") );

也可以方便地统计:

Integer sum = personEntityList.stream().mapToInt( a -> ( a.getIncome() == null ? 0 : a.getIncome() ) ).sum();

筛出女生姓名:

List nameList = personEntityList.stream().filter( a -> ("F".equals( a.getGender() ) ) ).map( a -> a.getName() ).collect( Collectors.toList() );

嘛。
很多时候我像对待英语或任何其他语言一样对待代码,从样本中发现规律,在使用中学习。其实这样是不对的。

你可能感兴趣的:(神奇的 stream 与它的好兄弟 collector)