一.Lambda表达式
1.Predicate函数式接口
Predicate接口定义了一个test抽象方法,可以接受范型T,并返沪一个boolean。可以用于通过判断筛选数据的操作
public class PredicateMain {
/*Predicate是函数式接口,test方法返回一个Boolean值*/
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
List<T> results = new ArrayList<>();
for (T t : list) {
if (p.test(t)) {
results.add(t);
}
}
return results;
}
public static void main(String[] args) {
List<String> stringList = Arrays.asList("", "aa", "bb");
/*实现函数式接口,并将具体业务逻辑注入*/
Predicate<String> noEmptyStringPredicate = (String s) -> !s.isEmpty();
List<String> noEmpty = filter(stringList, noEmptyStringPredicate);
System.out.println(noEmpty.toString());
Predicate<String> stringPredicate=(String s) ->s.length()==5;
System.out.println("result: "+stringPredicate.test("Hello"));
}
}
2.Consumer函数式接口
Consumer接口定义了一个accept的抽象方法,可以接受范型T,并且不返回方法。可以用于一些计算逻辑
public class ConsumerMain {
public static <T> void fotEach(List<T> list, Consumer<T> c) {
for (T t : list) {
c.accept(t);
}
}
public static void main(String[] args) {
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 6);
fotEach(integerList, (Integer i) -> System.out.println(i));
Consumer<String> stringConsumer = (String s) -> System.out.println(s + " World!");
stringConsumer.accept("Hello");
}
}
3.Function函数式接口
Function接口定义了一个叫做apply方法,可以接受范型T,并且返回范型T。可以用于将对象属性组装成一个新的集合
public class FunctionMain {
public static <T, R> List<R> map(List<T> list, Function<T, R> f) {
List<R> result = new ArrayList<>();
for (T s : list) {
result.add(f.apply(s));
}
return result;
}
public static void main(String[] args) {
List<String> stringList = Arrays.asList("aaaa", "bbb", "cc", "d");
List<Integer> integerList = map(stringList, (String s) -> s.length());
System.out.println(integerList);
Function<Integer, String> function = (Integer o) -> String.valueOf(o + 100);
System.out.println("result: " + function.apply(4));
}
}
4.Supplier函数式接口
Function接口定义了一个叫做get方法,不接受参数,并且返回范型T,相当于对象创建工厂。
public static void main(String[] args) {
Supplier<Apple> appleSupplier=()->new Apple(100);
System.out.println(appleSupplier.get());
}
5.BiFunction函数式接口
表示一个接受两个参数并返回范型T的函数。
public static void main(String[] args) {
BiFunction<String,Integer,Apple> appleBiFunction=Apple::new;
Apple apple=appleBiFunction.apply("red",160);
System.out.println(apple);
}
5.构造函数引用
public static void main(String[] args) {
Function<Integer, Apple> appleFunction = Apple::new;
/*等价于以下代码*/
// Function<Integer,Apple> appleFunction1=integer -> new Apple(integer);
Apple apple = appleFunction.apply(150);
System.out.println(apple);
}
6.谓词复合
public class LambdaMain {
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
List<T> results = new ArrayList<>();
for (T t : list) {
if (p.test(t)) {
results.add(t);
}
}
return results;
}
public static void main(String[] args) {
List<Apple> appleList=Arrays.asList(new Apple("red",130),
new Apple("yellow",110),
new Apple("green",120),
new Apple("green",110));
Predicate<Apple> applePredicate=apple -> "red".equals(apple.getColor());
System.out.println(filter(appleList,applePredicate));
Predicate<Apple> noApplePredicate=applePredicate.negate();
System.out.println(filter(appleList,noApplePredicate));
Predicate<Apple> redAndHeavyApple=noApplePredicate.and(apple -> apple.getWeight()>110);
System.out.println(filter(appleList,redAndHeavyApple));
}
}
7.函数复合
public class Letter {
public static String addHeader(String text){
return "From Raoul,Mario and Alan:"+text;
}
public static String addFooter(String text){
return text+"Kind regards";
}
public static String checkSpelling(String text){
return text.replaceAll("labda","lambda");
}
public static void main(String[] args) {
Function<String,String> addHeader=Letter::addHeader;
Function<String,String> transformtionPipeline=addHeader.andThen(Letter::checkSpelling).andThen(Letter::addFooter);
Function<String,String> transformtionPipeline1=addHeader.andThen(Letter::addFooter);
System.out.println(transformtionPipeline.apply("11"));
System.out.println(transformtionPipeline1.apply("11"));
}
}