2016-04-17 10 views
9

私はいくつかの小さなリストに分割したいリストaを持っています。java8を使って述語でリストを分割する方法は?

「aaa」を含むすべての項目、「bbb」を含むすべての項目、およびいくつかの述語があります。

どうすればjava8を使用できますか?

私はこのpostを見ましたが、2つのリストにしか分割しません。

public void partition_list_java8() { 

    Predicate<String> startWithS = p -> p.toLowerCase().startsWith("s"); 

    Map<Boolean, List<String>> decisionsByS = playerDecisions.stream() 
      .collect(Collectors.partitioningBy(startWithS)); 

    logger.info(decisionsByS); 

    assertTrue(decisionsByS.get(Boolean.TRUE).size() == 3); 
} 

私はこの postを見ましたが、それは、java 8

+2

述語がブール値です。それはちょうど "真"と "偽"を持っています。あなたのケースでは、 'Function'と' Collectors :: groupingBy'を使うほうが良いでしょう。 – RealSkeptic

答えて

22

@RealSkepticcommentPredicateのように、trueとfalseの2つの結果しか返せません。つまり、データを2つのグループに分けることができます。
必要なものはFunctionなので、一緒にグループ化する必要がある要素の共通の結果を判断できます。あなたの場合、そのような結果はその小文字の最初の文字になる可能性があります(すべての文字列が空ではない - 少なくとも1文字を持つと仮定します)。

Collectors.groupingBy(function)では、すべての要素を別々のリストにグループ化し、マップに格納することができます。ここで、キーはグループ化に使用される一般的な結果(最初の文字のように)になります。

だからあなたのコードは

Function<String, Character> firstChar = s -> Character.toLowerCase(s.charAt(0)); 

List<String> a = Arrays.asList("foo", "Abc", "bar", "baz", "aBc"); 
Map<Character, List<String>> collect = a.stream() 
     .collect(Collectors.groupingBy(firstChar)); 

System.out.println(collect); 

出力のようになります。

{a=[Abc, aBc], b=[bar, baz], f=[foo]} 
2

あなたは(グループ化)のあなたのストリームをオンにするCollectors.groupingByを使用する前に、非常に古いだった - >(そのグループにおけるもののリスト)。グルーピング自体に気にしない場合は、そのマップ上でvalues()と呼んで、パーティションのCollection<List<String>>を取得してください。

関連する問題