第五章 高級集合類和收集器

5.1方法引用

artist->artist.getName();
Artist::getName

用lambda表達(dá)式創(chuàng)建一個artist對象:
(name,nationality)->new Artist(name,nationality)
Artist::new

創(chuàng)建字符串型數(shù)組
String[]::new

5.2元素順序

List集合類型中的元素是按順序排列,HashSet是無序的,增加了流操作后,順序問題更加復(fù)雜
例5-1 順序測試永遠(yuǎn)通過
List<Integer> number=asList(1,2,3,4); List<Integer>sameOrder=number.stream().collect(toList()); assertEquals(number,sameOrder);
例5-2 順序測試不能每次都通過
Set<Integer> numbers=new HashSet<>(asList(4,9,2,1)); List<Integer>sameOrder=numbers.stream().collect(Collectors.toList()); assertEquals(number,sameOrder);
例5-3 順序
Set<Integer> numbers=new HashSet<>(asList(4,9,2,1)); List<Integer>sameOrder=numbers.stream().sorted().collect(Collectors.toList()); System.out.println(sameOrder);

5.3使用收集器

java.util.stream.Collectors類中靜態(tài)導(dǎo)入

5.3.1轉(zhuǎn)換成其他集合

例5-5 使用toCollection
List<String> list=new ArrayList<String>(); list.add("a"); list.add("b"); list.stream().collect(toCollection(ArrayList::new)).forEach(n-> System.out.println(n)); //方式二: List<String> listNew = Arrays.asList("a","m"); listNew.stream().collect(toCollection(ArrayList::new)).forEach(n-> System.out.println(n));

5.3.2 轉(zhuǎn)換成值

例5-6 找出成員最多的樂隊

import java.util.stream.Stream;

public class Artist {

    private final String name;
    private final String origin;
    private Stream<Artist> members;
    Boolean isSolo;

    public Artist(String name, String origin) {
        this.name = name;
        this.origin = origin;
        this.members = null;
    }

    public Artist(String name, String origin,Stream<Artist> members,Boolean isSolo) {
        this.name = name;
        this.origin = origin;
        this.members = members;
        this.isSolo=isSolo;
    }

    public String getName() {
        return name;
    }

    public String getOrigin() {
        return origin;
    }

    public Stream<Artist> getMembers() {
        return members;
    }

    @Override
    public String toString() {
        return name;
    }

    public Boolean getSolo() {
        return isSolo;
    }

    public void setSolo(Boolean solo) {
        isSolo = solo;
    }
}
 List<Artist> artists = Arrays.asList(
                new Artist("Fossils", "Kolkata", Stream.of(new Artist("Rupam Islam", "Kolkata"), new Artist("Deep", "Kolkata"), new Artist("Allan", "Kolkata"), new Artist("Chandramouli", "Kolkata"), new Artist("Tanmoy", "Kolkata")),false),
                new Artist("Linkin Park", "California", Stream.of(new Artist("Chester Bennington", "California"), new Artist("Dave Farrell", "California"), new Artist("Mike Shinoda", "California"), new Artist("Rob Bourdon", "California"), new Artist("Brad Delson", "California")),false),
                new Artist("Cactus", "Kolkata", Stream.of(new Artist("Sidhartha Sankar", "Kolkata"), new Artist("Dibyendu Mukherjee", "Kolkata"), new Artist("Ritaprabha", "Kolkata"), new Artist("Sudipto", "Kolkata"), new Artist("Mainak", "Kolkata")),false),
                new Artist("Backstreet Boys", "Florida", Stream.of(new Artist("A. J. McLean", "Florida"), new Artist("Howie D.", "Florida"), new Artist("Nick Carter", "Florida"), new Artist("Kevin Richardson", "Florida"), new Artist("Brian Littrell", "Florida")),false),
                new Artist("Prohori", "Kolkata", Stream.of(new Artist("Pritam", "Kolkata")),true));

以下例子未解決

Function<Artist,Long> getCount = artist -> artist.getMembers().count();
        Optional<Artist> maxNumber2=artists.stream().collect(Collectors.maxBy(comparing(getCount)));
        System.out.println(maxNumber2.get());

簡單例子

Stream<Integer> stream=Stream.of(1,2,3,4,5);
        Optional<Integer> maxNumber=stream.collect(Collectors.maxBy(Comparator.naturalOrder()));
        System.out.println(maxNumber.get());

5.3.3 數(shù)據(jù)分塊

partitioningBy收集器

   List<Artist> artists = Arrays.asList(
                new Artist("Fossils", "Kolkata", Stream.of(new Artist("Rupam Islam", "Kolkata"),
                        new Artist("Deep", "Kolkata"),
                        new Artist("Allan", "Kolkata"),
                        new Artist("Chandramouli", "Kolkata"),
                        new Artist("Tanmoy", "Kolkata")), true),
                new Artist("Backstreet Boys", "Florida", Stream.of(new Artist("A. J. McLean", "Florida"),
                        new Artist("Howie D.", "Florida"),
                        new Artist("Nick Carter", "Florida"),
                        new Artist("Kevin Richardson", "Florida"),
                        new Artist("Brian Littrell", "Florida")), false));
        System.out.println(artists.stream().collect(partitioningBy(artist -> artist.isSolo)));
        System.out.println(artists.stream().collect(partitioningBy(Artist::getSolo)));

使用predicate對象判斷一個元素應(yīng)該屬于哪個部分

5.3.4 數(shù)據(jù)分組

groupingBy收集器

5.3.4 字符串

List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada"); String G7Countries=G7.stream().map(x->x.toUpperCase()).collect(Collectors.joining(",")); System.out.println(G7Countries);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容