Потоки Java 8 - передача метода в фильтр - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть набор целых чисел set2 и объект:

public class Bucket {
    private Integer id;
    private Set<Integer> set1;
...
}

Я хочу фильтровать Buckets, используя потоки, но только те, где их set1 имеет пересечение с другим set2.Я попробовал следующий код:

Set<Bucket> selectedBuckets = allBuckets.stream()
    .filter(e -> Sets.intersection(e.getSet1(), set2).size()>1)
    .collect(Collectors.toSet());

Но это вернуло бы все элементы allBuckets, а не только те элементы, наборы которых содержат пересечение.Как я могу это сделать ?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я нашел ошибку.На самом деле я пытался воспроизвести, используя Integers вместо объекта Bucket, например:

Set<Integer> set1 = new HashSet<>();
  set1.add(1);
  set1.add(2);
  set1.add(3);
  set1.add(4);

Set<Integer> set2 = new HashSet<>();
  set2.add(2);
  set2.add(3);
  set2.add(5);
  set2.add(6); 

Set<Integer> relevantBuckets = set1.stream()
            .filter(e -> Sets.intersection(set1, set2).size()>0)
            .collect(Collectors.toSet());

System.out.println(relevantBuckets);

печатает: [1, 2, 3, 4]

Когда я воспроизводил с использованием объекта, онработал нормально.

Set<Integer> allElements = new HashSet<>();
   allElements.add(1);
   allElements.add(2);
   allElements.add(3);
   allElements.add(4);
   allElements.add(5);

Set<Integer> set1 = new HashSet<>();
    set1.add(1);
    set1.add(2);

Set<Integer> set2 = new HashSet<>();
    set2.add(1);
    set2.add(20);

    Bucket bucket1 = new Bucket();
    bucket1.setId(1);
    bucket1.setMySet(set1);

    Bucket bucket2 = new Bucket();
    bucket2.setId(2);
    bucket2.setMySet(set2);

    Set<Bucket> allBuckets = new HashSet<>();
    allBuckets.add(bucket1);
    allBuckets.add(bucket2);


    Set<Bucket> selectedBuckets = allBuckets.stream()
            .filter(e -> Sets.intersection(e.getMySet(), allElements).size()>0)
            .collect(Collectors.toSet());

    System.out.println(selectedBuckets);

печатает: [Bucket [id = 1], Bucket [id = 2]]

    selectedBuckets = allBuckets.stream()
            .filter(e -> Sets.intersection(e.getMySet(), allElements).size()>1)
            .collect(Collectors.toSet());

    System.out.println(selectedBuckets);

печатает: [Bucket [id = 1]]

Я подумал об удалении вопроса, но поскольку сообщество могло извлечь из него пользу, я решил ответить на вопрос сам, а не редактировать.

0 голосов
/ 21 февраля 2019

То, что вы могли просто искать, предполагая, что вы имели в виду пересечение (из Set содержимого set1) с любым другим Bucket в List:

List<Bucket> allBuckets = new ArrayList<>(); // as you may initialise
Set<Bucket> selectedBuckets = allBuckets.stream()
        .filter(e -> allBuckets.stream()
                .filter(f -> f != e)
                .flatMap(b -> b.getSet1().stream())
                .anyMatch(s -> e.getSet1().contains(s)))
        .collect(Collectors.toSet());
...