필터의 첫 번째 요소가 여러 검사와 일치 술어

안토니 :

나는 스트림을 사용하여 두 개의 서로 다른 조건과 POJO를의 목록을 필터링하는 것을 시도하고있다.

public class Toy {
  public boolean isRed();
  public boolean isBlue();
  public boolean isGreen();
}

public class RedBlueExtravaganza {
  public RedBlueExtravaganza(RedToy rt, BlueToy bt) {
    //construct
  }
}

// Wrappers around Toy with more verbose names
public class RedToy extends Toy { }
public class BlueToy extends Toy { }
public class GreenToy extends Toy { }

기본적으로, 나는 처음 빨간색과 장난감 개체의 목록의 첫 번째 파란색 장난감을 원한다.

List<Toy> toyList = Arrays.asList(greenToy1, redToy1, greenToy2, redToy2, blueToy1);

나는 다음을 수행 스트림을 작성합니다 :

RedBlueExtravaganza firstRedBlueList = toyList.stream()
       // get first red but keep rest of list
       // get first blue but keep rest of list
       // discard rest of list
       // map to a Tuple (or something) to distinguish the one red and one blue toy
       // map to RedBlueExtravaganza
       .findFirst()
       .get();

log.info(firstRedBlueList); // now contains redToy1, blueToy1

도와 주셔서 감사합니다!

라빈 드라 Ranwala :

여기서 끝에서 당신에게 처음으로 빨간색과 파란색 장난감을 제공 한 번만 목록을 통과하는 솔루션이다. 우리는 다른 의미도 없습니다 색상을 필터링하고 그 키 장난감이 빨간색과 값이 주어진 조건에 일치하는 첫 번째 장난감 여부지도를 만들 수 있습니다. 여기 보이는 방법입니다.

Map<Boolean, Toy> firstRedAndBlueToysMap = toyList.stream()
    .filter(t -> t.isBlue() || t.isRed())
    .collect(Collectors.toMap(Toy::isRed, t -> t, (a, b) -> a));
Toy firstRedToy = firstRedAndBlueToysMap.get(true);
Toy firstBlueToy = firstRedAndBlueToysMap.get(false);

그리고 여기에 문제를 해결하기 위해 한 단계 접근 방식이다.

RedBlueExtravaganza firstRedAndBlueToyPair = toyList.stream()
    .filter(t -> t.isBlue() || t.isRed())
    .collect(Collectors.collectingAndThen(Collectors.toMap(Toy::isRed, 
           t -> t, (a, b) -> a),
        m -> new RedBlueExtravaganza(m.get(true), m.get(false))));

이를 위해 PS 당신이 당신의 다음 생성자를 가질 필요가 작동하려면 RedBlueExtravaganza당신이 위에서 제공 한 것과 클래스 반대.

public RedBlueExtravaganza(Toy rt, Toy bt) {
    if (!(rt instanceof RedToy) || !(bt instanceof BlueToy))
        throw new IllegalArgumentException();

    // remainder omitted.
}

추천

출처http://43.154.161.224:23101/article/api/json?id=329943&siteId=1