對(duì)平平常常的事物表示驚奇籍滴。
流,是個(gè)很酷的字眼贰镣。輸入流輸出流呜象,字符流字節(jié)流,心流碑隆。Stream, flow, whatever. 想象颶風(fēng)把一切吹進(jìn)了長(zhǎng)長(zhǎng)的管道恭陡,從另一頭出來(lái)時(shí),它們?nèi)挤珠T別類堆放整齊上煤。stream 是破壞者休玩,collector 是強(qiáng)迫癥。
引狼入室:
import java.util.stream.Collectors;
如果你有一個(gè) list of entity劫狠,想把某個(gè)屬性取出來(lái)集中存放:
List<String> nameList = personEntityList.stream().map( a -> a.getName() ).collect( Collectors.toList() );
可以操縱它們拴疤,比如拼接:
List<String> nameAgeList = personEntityList.stream().map( a -> (a.getName() + ":" + a.getAge() ) ).collect( Collectors.toList() );
說(shuō)到這里好像都是 map() 的功勞。
還可以按某屬性分組独泞,得到一個(gè) map呐矾,key 是用來(lái)分組的屬性,value 是具備這個(gè)屬性的對(duì)象列表懦砂。按性別分組蜒犯,用神奇的雙帽號(hào)獲取屬性:
Map<String, List<PersonEntity>> map = personEntityList.stream().collect( Collectors.groupingBy( PersonEntity :: getGender ) );
toMap() with merge function组橄!key 沖突時(shí),保留前一個(gè)愧薛,舍棄后一個(gè):( k1, k2 ) -> k1晨炕,得到 map。
// 所以一個(gè)城市只能有一個(gè)代表啦
Map<String, PersonEntity> map = personEntityList.stream().collect( Collectors.toMap( PersonEntity :: getCity, a -> a, ( k1, k2 ) -> k1 ) );
或者不用 a -> a毫炉,用 Function.identity() 得到本尊:
Map<String, PersonEntity> map = personEntityList.stream().collect( Collectors.toMap(PersonEntity :: getPhone, Function.identity() ) );
定制你的 map瓮栗,只把對(duì)應(yīng)的 ID 和手機(jī)號(hào)取回來(lái):
Map<String, String> 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() ), ",");
后來(lái)發(fā)現(xiàn)用 Collectors.joining() 就好了:
String phoneStr = personEntityList.stream().map( a -> a.getPhone() ).collect(Collectors.joining(",") );
也可以方便地統(tǒng)計(jì):
Integer sum = personEntityList.stream().mapToInt( a -> ( a.getIncome() == null ? 0 : a.getIncome() ) ).sum();
篩出女生姓名:
List<String> nameList = personEntityList.stream().filter( a -> ("F".equals( a.getGender() ) ) ).map( a -> a.getName() ).collect( Collectors.toList() );
嘛。
很多時(shí)候我像對(duì)待英語(yǔ)或任何其他語(yǔ)言一樣對(duì)待代碼瞄勾,從樣本中發(fā)現(xiàn)規(guī)律费奸,在使用中學(xué)習(xí)。其實(shí)這樣是不對(duì)的进陡。