lambda表达式
把一块代码赋值给一个变量,被赋值给一个变量的函数就是lambda表达式。
给上面的声明加上一个接口类型@FunctionalInterface。
函数接口
Consumer
执行在单个参数上的操作。
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);
greeter.accept(new Person("Luke", "Skywalker"));
Supplier
不需要参数,并返回一个任意范型的值。如果需要的场景,不止需要consume或者map,还包括了new这个动作,Supplier表达了这种能力。
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Supplier<Person> personSupplier = Person::new;
personSupplier.get(); // new Person
Predicate
只有一个参数,返回boolean类型。Stream的filter接受Predicate作为入参。
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Predicate<String> predicate = (s) -> s.length() > 0;
predicate.test("foo"); // true
predicate.negate().test("foo"); // false
Predicate<Boolean> nonNull = Objects::nonNull;
Predicate<Boolean> isNull = Objects::isNull;
Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isNotEmpty = isEmpty.negate();
Function
有一个入参,然后返回一个结果。附带了一些可以和其他函数组合的默认方法 compose、andThen。
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"
Operator
算子,映射类型函数。
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
static <T> UnaryOperator<T> identity() {
return t -> t;
}
}
Function.identity() 等价于 t -> t
方法引用
方法引用用来访问已经存在的方法或者构造方法,引用而不执行方法的方式,构成目标类型上下文。
调用一个已经存在的方法:
Arrays.sort(strArray, (s1, s2) -> s1.compareToIgnoreCase(s2));
简写lambda表达式中已经存在的方法:
Arrays.sort(strArr, String::compareToIgnoreCase);
引用静态方法、对象实例方法、构造方法。
流处理
父接口 BaseStream IntStream LongStream DoubleStream Stream
-
中间操作 concat distinct filter flatMap limit map peek skip sorted parallel sequential unordered
-
结束操作 allMatch anyMatch collect count findAll findFirst forEach forEachOrdered max min noneMatch reduce toArray
Optional + lambda
- 存在则继续
//java8
opt.ifPresent(System.out::println);
//java7
if (person != null) {
System.out.println(person);
}
- 存在则返回,无则返回不存在
return opt.orElse(UNKONWN_PERSON);
//java7
if (person != null) {
return person;
} else {
return UNKONWN_PERSON;
}
3.存在则返回,无则由函数产生
return opt.orElseGet(() -> getAPersonFromDB());
//java7
if (person != null) {
return person;
} else {
return getAPersonFromDB();
}
4.连环null检查
return opt.map(p -> p.getLastName())
.map(name -> name.toUpperCase())
.orElse(null);
//java7
if (person != null) {
String name = person.getLastName();
if (name != null) {
return name.toUpperCase();
} else {
return null;
}
} else {
return null;
}