lambda表达式

220 阅读2分钟

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

  1. 中间操作 concat distinct filter flatMap limit map peek skip sorted parallel sequential unordered

  2. 结束操作 allMatch anyMatch collect count findAll findFirst forEach forEachOrdered max min noneMatch reduce toArray

Optional + lambda

  1. 存在则继续
//java8
opt.ifPresent(System.out::println);

//java7
if (person != null) {
	System.out.println(person);
}
  1. 存在则返回,无则返回不存在
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;
}

参考文献

Java8版本特性-lambda表达式

lambda表达式