一.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"));}}
