3
// given a set of Item objects, group them by the managers of creator and owners
Map<String, List<Item>> managersItems = 
    itemSet.parallelStream().flatMap(item -> {
        // get the list of the creator and owners
        List<String> users = new ArrayList();
        users.add(item.getCreator());
        users.addAll(item.getOwners());
        return Stream.of(users.toArray(new String[] {})).map(user -> {
            LdapUserInfo ldapUser = LdapUserInfoFactory.create(user);
            String manager = ldapUser.getManager();
            return new AbstractMap.SimpleImmutableEntry<String, Item(manager, item);
        });
    }).collect(
        Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

このコードは Eclipse Mars では正常にコンパイルされますが、Eclipse Luna では次のエラーが発生します。

Map<Object,List<Object>>型の不一致: からに変換できませんMap<String,List<WeblabInfo>>

返された をEclipse Luna の with に割り当てないと、エラーは at Mapand statement with message:Map<String, List<Item>> managersItem =Map.Entry::getKeyMap.Entry::getValue

タイプは、ここで適用できるものをMap.Entry定義していません。」getKey(Object)

私は何を間違えましたか?

4

2 に答える 2

4

あなたは何も悪いことをしていません。Eclipse コンパイラには、これらの問題を引き起こす型推論に関する問題があります。Luna の互換性が重要な場合は、明示的な型をラムダ式に追加する必要があります。たとえば、次のようにしてください。Map.Entry::<String,Item>getKey

別の注意として、aListを配列に変換してストリーミングする必要はありません。直接呼び出すことができますusers.stream()。ただし、作成するList必要はありません。代わりに使用できますStream.concat(Stream.of(item.getCreator()), item.getOwners().stream())(確かに、少し扱いに​​くいです)。

parallelStream最後に (そして最も重要なこととして) 、外部システムでデータを検索するなどのブロック コードでの使用は避けてください。並列ストリームは、CPU バウンドのタスクを処理するように設計されています。

于 2015-10-13T01:23:04.603 に答える