bugfix> java > 投稿

次のリストのリストがあるとしましょう」

List l1 = Arrays.asList(1,2,3,4);
List l2 = Arrays.asList(1,2,3,4,5);
List l3 = Arrays.asList(1,2,3,4,5,6);
List<List> lists = Arrays.asList(l1,l2,l3);

Java 8ストリームAPIを使用して最大リストのサイズを知るにはどうすればよいですか? 私はこのようなものがうまくいくと思った:

lists.stream().reduce(Integer.MIN_VALUE, (a,b) -> Integer.max(a.size(), b.size()));

しかし、明らかな理由で、それは私に与えています:

Type mismatch: cannot convert from int to List

上記のJava 8ストリームを使用してどうすればよいですか? (また、可能な他のより良いアプローチがある場合)

また、最大サイズのリストへの参照を取得できますか?

回答 5 件
  • max を呼び出すだけです :

    lists.stream().mapToInt(List::size).max().getAsInt()
    
    

    そして、最大サイズのリストを取得するには:

    lists.stream().max(Comparator.comparing(List::size)).get()
    
    

  • リストのみではなく、サイズのみを知る必要がある場合。

    List l1 = Arrays.asList(1,2,3,4);
    List l2 = Arrays.asList(1,2,3,4,5);
    List l3 = Arrays.asList(1,2,3,4,5,6);
    List<List> lists = Arrays.asList(l1,l2,l3);
    lists.stream().map(List::size).max(Comparator.naturalOrder()).get();
    
    

  • reduceを使用して最長のリストを取得するには、次のようにします。

       Optional<List> list=lists.stream().reduce((a, b) -> a.size()>b.size()? a:b);
    
    

    これにより、文字列のリストがサイズに基づいて単一のリストに縮小されます(そのリストはオプションです)。そのサイズを印刷するには、次のようにします。

       list.ifPresent((a)-> System.out.println(a.size()));
    
    

    または、1つのライナーは次のようになります。

       lists.stream().reduce((a, b) -> a.size()>b.size()? a:b).ifPresent((a)-> System.out.println(a.size()));
    
    

  • サイズを縮小するのではなく、マップ操作を使用してサイズを取得し、組み込みメソッド max で最大値を見つけることができます  (これは OptionalInt を返します 、したがって、 get を使用します   int を返す )

    lists.stream().mapToInt(x -> x.size()).max().getAsInt()
    
    

  • int max = 0;
    for (List list : lists) {
        if (list.size() > max) {
            max = list.size();
        }
    }
    
    

あなたの答え