函数式接口
@FunctionalInterface
public interface MathOperation {
int operation(int a, int b);
static int sum(int a, int b) {
return a + b;
}
}
可以这样写:
MathOperation operation = (a, b) -> a + b;
operation.operation(2, 3);
方法引用::
以上是两数相加,其实MathOperation已经有sum函数,又可以写为:
MathOperation operation = (a, b) -> MathOperation.sum(a, b);
用 :: 可以简化为:
MathOperation operation = MathOperation::sum;
forEach
List<String> letters = Arrays.asList("a", "b", "c");
for (String letter : letters) {
System.out.println(letter);
}
可以这样写:
List<String> letters = Arrays.asList("a", "b", "c");
letters.forEach(n -> System.out.println(n));
// 使用方法引用::简化为:
letters.forEach(System.out::println);
Predicate
List<String> letters = Arrays.asList("a", "ab", "c");
filter(letters, n -> n.startsWith("a"));
public void filter(List<String> letters, Predicate<String> condition) {
letters.forEach(letter -> {
if (condition.test(letter)) {
System.out.println(letter + ".");
}
});
}
可以使用stream API简化,filter参数也是Predicate:
letters.stream().filter(n -> n.startsWith("a")).forEach(n -> System.out.println(n + "."));
Predicate 有 and、or等default方法:
Predicate<String> predicate = n -> n.startsWith("a");
letters.stream().filter(predicate.and(n -> n.length() == 2))
.forEach(n -> System.out.println(n + "."));
Map
List<String> letters = Arrays.asList("a", "ab", "c");
letters.stream().map((String letter) -> letter + ".").forEach(System.out::println);
reduce()
List<String> letters = Arrays.asList("a", "ab", "c");
String s = letters.stream().map((String letter) -> letter + ".")
.reduce((append, letter) -> append + letter).get();
System.out.println(s);
collect()
List<String> letters = Arrays.asList("ab", "ab", "c");
List<String> list = letters.stream().filter(letter -> letter.contains("a"))
.map(String::toUpperCase)
.filter(letter -> letter.contains("A"))
.distinct()
.collect(Collectors.toList());
summaryStatistics
List<String> letters = Arrays.asList("1", "2", "3");
IntSummaryStatistics statistics = letters.stream().mapToInt(Integer::parseInt).summaryStatistics();
int min = statistics.getMin();
int max = statistics.getMax();
long sum = statistics.getSum();
double average = statistics.getAverage();
long count = statistics.getCount();