Javaの8ストリームAPIをリストにリストの一覧をフラット化

TWI:

私は、Java 8ストリームAPIを使用してはるかに簡単かもしれない次のコードを持っています:

List<List<String>> listOfListValues;
public List<String> getAsFlattenedList() {
        List<String> listOfValues= new ArrayList<>();
        for (List<String> value: listOfListValues) {
            listOfValues.add(String.valueOf(value));
        }
        return listOfValues;
    }

私はSOの解決策を検索し、これを見つけました:

listOfListValues.stream()
        .flatMap(List::stream)
        .collect(Collectors.toList());

しかし、これは私が欲しいものを同じことをしていません。

ローランド:

あなただけの「シンプル」を必要とmapここに:

List<List<String>> listOfListValues;
public List<String> getAsFlattenedList() {
    return listOfListValues.stream()
            .map(String::valueOf)
            .collect(toList());
}

flatMapむしろ1変換するために使用されStreamますが少ないし、より多くのエントリまたはが必要な場合は理にかなっている、別の現在利用可能な(あるいは単に、新たにマッピングされたStreamフィルタ/マップ/など、それをさらに下に)、例えば:

  • すべてのリストのすべてのユニークな文字列を数えます:

    listOfListValues.stream()
                    .flatMap(List::stream) // we want to count all, also those from the "inner" list...
                    .distinct()
                    .count()
    
  • 一定の大きさの後にTRUNCATEエントリ:

    listOfListValues.stream()
            .flatMap(list -> {
                if (list.size() > 3) // in this case we use only some of the entries
                    return Stream.concat(list.subList(0, 2).stream(), Stream.of("..."));
                else
                    return list.stream();
            })
            .collect(Collectors.toList());
    
  • いくつかの興味のあるキーのマップの値を平坦化します。

    Map<Key, List<Value>> map = new HashMap<>();
    Stream<Value> valueStream = interestedKeys.stream()
                                              .map(map::get)
                                              .flatMap(List::stream);
    

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=196298&siteId=1