43

Listaを aに変換できるようにしたいと考えていますHashMap。ここで、キーは でelementNameあり、値はランダムなもののリストです (この場合は要素名)。つまり、私は(A->List(A), B->List(B), C-> List(C))が欲しいのです。toMap()and を使用して渡そうとしkeyMapperましValueMapperたが、コンパイルエラーが発生します。誰かが私を助けてくれれば本当に感謝しています。

ありがとう!

public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<String> list = Arrays.asList("A","B","C","D");
    Map<String, List<String>> map = list.stream().map((element)->{
        Map<String, List<String>> map = new HashMap<>();
        map.put(element, Arrays.asList(element));
        return map;
    }).collect(??);
}


Function<Map<String, String>, String> key = (map) -> {
    return map.keySet().stream().findFirst().get();
};

Function<Map<String, String>, String> value = (map) -> {
    return map.values().stream().findFirst().get();
};

===これは私のために働いた

みんな助けてくれてありがとう!@izstas「要素を操作する必要があります」は大いに役立ちました:)。実際、これは私が正確に探していたものです

public static void test2 (){
    Function<Entry<String, List<String>>, String> key = (entry) -> {
        return entry.getKey();
    };
    Function<Entry<String, List<String>>, List<String>> value = (entry) -> {
        return new ArrayList<String>(entry.getValue());
    };
    BinaryOperator<List<String>> merge = (old, latest)->{
        old.addAll(latest);
        return old;
    };

    Map<String, List<String>> map1 = new HashMap<>();
    map1.put("A", Arrays.asList("A1", "A2"));
    map1.put("B", Arrays.asList("B1"));
    map1.put("D", Arrays.asList("D1"));

    Map<String, List<String>> map2 = new HashMap<>();
    map2.put("C", Arrays.asList("C1","C2"));
    map2.put("D", Arrays.asList("D2"));

    Stream<Map<String, List<String>>> stream =Stream.of(map1, map2);
    System.out.println(stream.flatMap((map)->{
        return map.entrySet().stream(); 
    }).collect(Collectors.toMap(key, value, merge)));
}
4

3 に答える 3

88

メソッドを使用してgroupingBy集計を管理できます。次に例を示します。

public static void main(String[] args) {
    List<String> list = Arrays.asList("A", "B", "C", "D", "A");
    Map<String, List<String>> map = list.stream().collect(Collectors.groupingBy(Function.identity()));
}

より柔軟性が必要な場合 (たとえば、値をマップし、List ではなく Set を返す場合) groupingBy、javadoc で指定されているように、より多くのパラメーターを指定してメソッドをいつでも使用できます。

Map<City, Set<String>> namesByCity = people.stream().collect(Collectors.groupingBy(Person::getCity, mapping(Person::getLastName, toSet())));
于 2015-07-16T14:09:03.347 に答える
25

関数keyvalueコードで定義した関数は、リストの要素Mapで動作する必要があり、要素がs ではないため、正しくありません。

次のコードは私にとってはうまくいきます:

List<String> list = Arrays.asList("A", "B", "C", "D");
Map<String, List<String>> map = list.stream()
        .collect(Collectors.toMap(Function.identity(), Arrays::asList));

の最初の引数Collectors.toMapは、リスト要素からキーを作成する方法 (そのままにしておく) を定義し、2 番目の引数は、値を作成する方法 (ArrayList単一の要素で an を作成する) を定義します。

于 2014-07-23T17:57:55.603 に答える
8

みんな助けてくれてありがとう!@izstas「要素を操作する必要があります」は大いに役立ちました:)。実際、これは私が正確に探していたものです

public static void test2 (){
    Function<Entry<String, List<String>>, String> key = (entry) -> {
        return entry.getKey();
    };
    Function<Entry<String, List<String>>, List<String>> value = (entry) -> {
        return new ArrayList<String>(entry.getValue());
    };
    BinaryOperator<List<String>> merge = (old, latest)->{
        old.addAll(latest);
        return old;
    };

    Map<String, List<String>> map1 = new HashMap<>();
    map1.put("A", Arrays.asList("A1", "A2"));
    map1.put("B", Arrays.asList("B1"));
    map1.put("D", Arrays.asList("D1"));

    Map<String, List<String>> map2 = new HashMap<>();
    map2.put("C", Arrays.asList("C1","C2"));
    map2.put("D", Arrays.asList("D2"));

    Stream<Map<String, List<String>>> stream =Stream.of(map1, map2);
    System.out.println(stream.flatMap((map)->{
        return map.entrySet().stream(); 
    }).collect(Collectors.toMap(key, value, merge)));
}
于 2014-07-24T13:53:08.970 に答える