68

ハッシュマップを考えてみましょう

Map<Integer, List> id1 = new HashMap<Integer,List>();

両方のハッシュマップにいくつかの値を挿入しました。

例えば、

List<String> list1 = new ArrayList<String>();

list1.add("r1");
list1.add("r4");

List<String> list2 = new ArrayList<String>();
list2.add("r2");
list2.add("r5");

List<String> list3 = new ArrayList<String>();
list3.add("r3");
list3.add("r6");

id1.put(1,list1);
id1.put(2,list2);
id1.put(3,list3);
id1.put(10,list2);
id1.put(15,list3);

Q1) ハッシュマップのキーにフィルタ条件を適用し、対応する値(リスト)を取得したい。

例: ここで私のクエリは key=1 で、出力は 'list1' である必要があります

私が書いた

id1.entrySet().stream().filter( e -> e.getKey() == 1);
            

しかし、このストリーム操作の出力としてリストとして取得する方法がわかりません。

Q2) 再度、ハッシュマップのキーにフィルター条件を適用し、対応するリストのリストを取得したいと考えています。

例: ここで、私のクエリは key=1% (つまり、キーは 1,10,15 のいずれか) で、出力は 'list1','list2','list3'(リストのリスト) になります。

4

7 に答える 7

40

あなたがする必要があるのは、のアウトを作成することStreamです:Map.entrySet()

// Map<K, V> --> Set<Map.Entry<K, V>> --> Stream<Map.Entry<K, V>>
map.entrySet().stream()

以降、.filter()これらのエントリを上書きできます。例えば:

// Stream<Map.Entry<K, V>> --> Stream<Map.Entry<K, V>>
.filter(entry -> entry.getKey() == 1)

そして、そこから値を取得するには.map():

// Stream<Map.Entry<K, V>> --> Stream<V>
.map(Map.Entry::getValue)

最後に、次のように収集する必要がありますList

// Stream<V> --> List<V>
.collect(Collectors.toList())

エントリが 1 つしかない場合は、代わりにこれを使用します (注: このコードは値があることを前提としています。それ以外の場合は、を使用し.orElse()ます。詳細については、のjavadoc をOptional参照してください)。

// Stream<V> --> Optional<V> --> V
.findFirst().get()
于 2015-04-14T10:59:36.247 に答える
4

Q2 については、質問に対する回答が既にあります。Q1 の場合、より一般的には、キーのフィルタリングによって一意の値が得られることがわかっている場合、Streams を使用する必要はまったくありません。

getまたはを使用するだけgetOrDefaultです。

List<String> list1 = id1.getOrDefault(1, Collections.emptyList());
于 2015-04-14T11:21:08.707 に答える
2

このようにすることもできます

public Map<Boolean, List<Student>> getpartitionMap(List<Student> studentsList) {

    List<Predicate<Student>> allPredicates = getAllPredicates();
    Predicate<Student> compositePredicate =  allPredicates.stream()
                             .reduce(w -> true, Predicate::and)
     Map<Boolean, List<Student>> studentsMap= studentsList
                .stream()
                .collect(Collectors.partitioningBy(compositePredicate));
    return studentsMap;
}

public List<Student> getValidStudentsList(Map<Boolean, List<Student>> studentsMap) throws Exception {

    List<Student> validStudentsList =  studentsMap.entrySet()
             .stream()
             .filter(p -> p.getKey() == Boolean.TRUE)
             .flatMap(p -> p.getValue().stream())
             .collect(Collectors.toList());

    return validStudentsList;
}

public List<Student> getInValidStudentsList(Map<Boolean, List<Student>> studentsMap) throws Exception {

    List<Student> invalidStudentsList = 
             partionedByPredicate.entrySet()
             .stream()
             .filter(p -> p.getKey() == Boolean.FALSE)
             .flatMap(p -> p.getValue().stream())
             .collect(Collectors.toList());

    return invalidStudentsList;

}

の代わりにflatMapちょうど得られます。List<Student>List<List<Student>>

ありがとう

于 2015-06-10T11:28:44.793 に答える