策略模式
Lambda表达式避免了采用策略设计模式时僵化的模板代码。1
2
3
4
5
6Validator numericValidator =
new Validator((String s) -> s.matches("[a-z]+"));
boolean b1 = numericValidator.validate("aaaa");
Validator lowerCaseValidator =
new Validator((String s) -> s.matches("\\d+"));
boolean b2 = lowerCaseValidator.validate("bbbb");
模板方法
通过传递Lambda表达式,直接插入不同的行为,不再需要继承。1
2
3
4
5
6public void processCustomer(int id, Consumer<Customer> makeCustomerHappy){
Customer c = Database.getCustomerWithId(id);
makeCustomerHappy.accept(c);
}
new OnlineBankingLambda().processCustomer(1337, (Customer c) ->
System.out.println("Hello " + c.getName());
观察者模式
无需显式地实例化观察者对象,直接传递Lambda表达式表示需要执行的行为即可。1
2
3
4
5
6
7
8
9
10f.registerObserver((String tweet) -> {
if(tweet != null && tweet.contains("money")){
System.out.println("Breaking news in NY! " + tweet);
}
});
f.registerObserver((String tweet) -> {
if(tweet != null && tweet.contains("queen")){
System.out.println("Yet another news in London... " + tweet);
}
});
责任链模式
将处理对象作为函数的一个实例,或者更确切地说作为UnaryOperator-
1
2
3
4
5
6
7UnaryOperator<String> headerProcessing =
(String text) -> "From Raoul, Mario and Alan: " + text;
UnaryOperator<String> spellCheckerProcessing =
(String text) -> text.replaceAll("labda", "lambda");
Function<String, String> pipeline =
headerProcessing.andThen(spellCheckerProcessing);
String result = pipeline.apply("Aren't labdas really sexy?!!")
工厂模式
1 | Supplier<Product> loanSupplier = Loan::new; |
假设你希望保存具有三个参数(两个参数为Integer类型,一个参数为String
类型)的构造函数;为了完成这个任务,你需要创建一个特殊的函数接口TriFunction。1
2
3
4
5public interface TriFunction<T, U, V, R>{
R apply(T t, U u, V v);
}
Map<String, TriFunction<Integer, Integer, String, Product>> map
= new HashMap<>();
匿名类
1 | Runnable r2 = () -> System.out.println("Hello"); |
有条件的延迟执行
1 | logger.log(Level.FINER, () -> "Problem: " + generateDiagnostic()); |