Well, in reality, it's not as much as I really hope for,
List.of("a", "", "b").stream()
.reject(s -> s.isEmpty())
.collect(Collectors.toList());
// => ["a", "b"]
I want to write like this.
It is written using Stream # filter
.
When I write various things ...
List.of("a", "", "b").stream()
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
Well, a simple implementation is not bad, but complicated conditions can get confusing.
Even under simple conditions, I'm afraid that you may miss !
At a glance.
List.of("a", "", "b").stream()
.filter(((Predicate<String>) (s -> s.isEmpty())).negate())
.collect(Collectors.toList());
//Hmmm cast annoying!
Predicate<String> emptyText = s -> s.isEmpty();
List.of("a", "", "b").stream()
.filter(emptyText.negate())
.collect(Collectors.toList());
The Predicate # negate
itself has achieved what I really want to do, but the cast is ...: scream:
//Returns the predicate of the negative condition of the original condition
private <E> Predicate<? super E> not(Predicate<? super E> p) {
return p.negate();
}
Making something like this
List.of("a", "", "b").stream()
.filter(not(s -> s.isEmpty()))
.collect(Collectors.toList());
Yup! not bad!
However, if you use not
as a utility, it will look like StreamUtils.not
and the description will be long.
public class StreamWrapper<T> {
private final Stream<T> stream;
// private constructor
private StreamWrapper(Stream<T> src) {
this.stream = src;
}
// make instance
public static <T> StreamWrapper<T> of(Stream<T> src) {
return new StreamWrapper(src);
}
// Stream#Wrap filter
public StreamWrapper<T> filter(Predicate<T> p) {
return this.of(stream.filter(p));
}
// Stream#Wrap collect
public <R, A> R collect(Collector<T, A, R> c) {
return stream.collect(c);
}
// ...A lot of other rap
/**
*Matches the specified predicate among the elements of this stream<b>do not do</b>Returns a stream composed of things.
* <p>
*This is an intermediate operation.
*
* @param predicate
*A non-interfering, stateless predicate that applies to each element to determine if it should be included
* @return new stream
*/
public StreamWrapper<T> reject(Predicate<T> predicate) {
return this.of(stream.filter(predicate.negate()));
}
}
Making something like this
StreamWrapper.of(List.of("a", "", "b").stream())
.reject(s -> s.isEmpty())
.collect(Collectors.toList());
You did it!
(~~ Well, it doesn't take so much time for reject
, but ... ~~)
~~ JMT (Implementation / Seriously / Effort: innocent :) ~~
Even if you say "I want this kind of intermediate operation!", It's hard to expand.
Java9 has added takeWhile`` dropWhile
ʻofNullable to make it more convenient, but it doesn't implement major features such as
zip(also
reject`), so try expanding it as needed. How is it? : yum: