new Thread(new Runnable() {
@Override
public void run() {
compute();
}
}).start();
new Thread(() -> compute()).start();
Set<T> bucket = new HashSet<>();
Applications.each(anIterator, new Action<>() {
@Override
public void perform(T value) {
bucket.add(value);
}
});
Set<T> bucket = new HashSet<>();
Applications.each(anIterator, value -> bucket.add(value));
Applications.map(strings, new Delegate<Ipv4, String>() {
@Override
public Ipv4 perform(String dottedIpAddress) {
return Ipv4.parse(dottedIpAddress);
}
});
Applications.map(strings, dottedIpAddress -> Ipv4.parse(dottedIpAddress));
Applications.map(anIterator, new Delegate<Ipv4, String>() {
@Override
public Ipv4 perform(String dottedIpAddress) {
return Ipv4.parse(dottedIpAddress);
}
});
Applications.map(anIterator, Ipv4::parse);
Applications.each(anIterator, new Action<T>() {
@Override
public void perform(T value) {
System.out.println(value);
}
});
Applications.each(anIterator, System.out::println);
Collections.sort(ipv4List, new Comparator<Ipv4>() {
@Override
public int compare(Ipv4 former, Ipv4 latter) {
return former.compareTo(latter);
}
});
Collections.sort(ipv4List, Ipv4::compareTo);
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
public abstract class ReadOnlyIterator<E> implements Iterator<E> {
@Override
public void remove() {
throw new UnsupportedOperationException("read-only iterator");
}
}
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<E> action) {
while(hasNext() {
action.accept(next());
}
}
}
Iterator.remove() throws UnsupportedOperationException
Iterator.forEachRemaining(E -> void)
Iterable.forEach(E -> void)
Collection.removeIf(E -> boolean)
Collection.stream()
List.replaceAll(E -> E)
List.sort((E, E) -> int)
Map.forEach((K, V) -> void)
Map.compute(K, (K, V) -> V)
Map.computeIfAbsent(K, K -> V)
Map.computeIfPresent(K, (K, V) -> V)
Map.getOrDefault(K, V)
Map.merge(K, V, (V, V) -> V)
Map.putIfAbsent(K, V)
Map.replace(K, V)
Map.replaceAll((K, V) -> V)
collection.stream()
Stream.of(T... values)
Arrays.stream(T[] array, int startInclusive, int endExclusive)
.map(T -> R)
[0,1,2,3].map(i -> i+1) => [1,2,3,4]
.flatMap(T -> Stream<R>)
[0,1,2,3].flatMap(i -> IntStream.range(0,i)) => [ 0 , 0,1 , 0,1,2]
.filter(T -> boolean)
[3,6,2,5,1].filter(i -> i < 3) => [2,1]
.distinct()
[1,4,2,5,2,3,1,2].distinct() => [1,4,2,5,3]
.limit(long maxSize)
[0,1,2,3,...].limit(5) => [0,1,2,3,4]
.skip(long n)
[0,1,2,3,...].skip(5) => [5,6,7,8,...]
.sorted()
[3,1,5,3,8,3].sorted() => [1,3,3,3,5,8]
.peek(T -> { ... })
triggers a side effect when an element passes through
.collect(Collector)
Collectors.toList()
Stream.of(1,2,3).collect(Collectors.toList()) => List[1,2,3]
Collectors.toCollection(Provider<Collection>)
Stream.of(1,2,1,2).collect(Collectors.toCollection(HashSet::new))
=> Set[1,2]
Collectors.toMap(T -> K, T -> V)
Stream.of("192.168.1.10", "192.168.3.101", "127.0.0.1")
.collect(Collectors.toMap(
ip -> Ipv4.parse(ip).mask("255.255.255.0"),
Function.identity()
)
);
=> Map {
"192.168.1.0": "192.168.1.10",
"192.168.3.0": "192.168.3.101",
"127.0.0.0" : "127.0.0.1"
}
Collectors.groupingBy(T -> K)
Stream.of("192.168.1.10", "192.168.1.37", "192.168.3.101", "127.0.0.1")
.collect(Collectors.groupingBy(
ip -> Ipv4.parse(ip).mask("255.255.255.0")
)
);
=> Map {
"192.168.1.0": List["192.168.1.10","192.168.1.37"],
"192.168.3.0": List["192.168.3.101"],
"127.0.0.0" : List["127.0.0.1"]
}
Collectors.joining(delimiter)
Collectors.joining(delimiter, prefix, suffix)
Streams.of("a", "b", "c").collect(Collectors.joining(",", "[", "]"));
=> "[a, b, c]"
.allMatch(T -> boolean)
.anyMatch(T -> boolean)
.noneMatch(T -> boolean)
Stream.of("asante", "sana", "cocco", "banana")
.anyMatch(word -> word.length() >= 6)
=> true
.findAny() // explicitly nondeterministic
.findFirst()
.count()
Stream.of(1,2,3).count() => 3
.forEach(T -> void)
// performs a side effect on all the elements of the stream
.reduce(T identity, (T, T) -> T accumulator)
Stream.of(1,2,3,4).reduce(1, (a, b) -> a * b) => 24
Optional.of("value")
Optional.empty()
Optional.ofNullable(somethingNullish)
.map(T -> R)
.flatMap(T -> Optional<R>)
.filter(T -> boolean)
.ifPresent(T -> { ... })
.orElse(T)
.orElseGet(() -> T)
.orElseThrow(() -> Throwable)
Optional<T> optional = Optional.empty();
Optional<Optional<T>> duplicate = optional.map(Optional::of);
Optional<T> result = duplicate.orElse(defaultOptional);