You can easily write your own Collector
public class AllOrNothing implements Collector, Optional>{
@Override
public Supplier> supplier() {
return () -> new HashSet<>();
}
@Override
public BinaryOperator> combiner() {
return (set1, set2)-> {
set1.addAll(set2);
return set1;
};
}
@Override
public Function, Optional> finisher() {
return (set) -> {
if(set.size() ==1){
return Optional.of(set.iterator().next());
}
return Optional.empty();
};
}
@Override
public Set characteristics() {
return Collections.emptySet();
}
@Override
public BiConsumer, T> accumulator() {
return Set::add;
}
}
Which you can use like this:
Optional result = myStream.collect( new AllOrNothing<>());
Here's your example test data
public static void main(String[] args) {
System.out.println(run());
System.out.println(run(1));
System.out.println(run(1,1));
System.out.println(run(2,2));
System.out.println(run(1,2));
}
private static Optional run(Integer...ints){
List asList = Arrays.asList(ints);
System.out.println(asList);
return asList
.stream()
.collect(new AllOrNothing<>());
}
which when run will print out
[]
Optional.empty
[1]
Optional[1]
[1, 1]
Optional[1]
[2, 2]
Optional[2]