안토니 :
나는 스트림을 사용하여 두 개의 서로 다른 조건과 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.
}