• 【java8】函数式接口


    函数式接口

    有且只包含一个抽象方法的接口,称为函数式接口。

    可以通过Lambda表达式来创建函数式接口的对象(只有函数式接口才能用Lambda表达式)。

    可以使用@FunctionalInterface来声明是一个函数式接口。

    常见的函数式接口:java.lang.Runnable、java.util.Comparator。

    package com.morris.java8.lamdba;
    
    public class RunnableExample {
    
        public static void main(String[] args) {
    
            // 匿名内部类
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " is running.");
                }
            }).start();
    
            // lamdba
            new Thread(() -> {
               System.out.println(Thread.currentThread().getName() + " is running.");
            }).start();
    
            // 进一步简化
            new Thread(() -> System.out.println(Thread.currentThread().getName() + " is running.")).start();
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    JDK提供的函数式接口

    java.util.function包中定义了大量的函数接口,下表列出了这些接口,并对其做一些简单的介绍。

    接口名说明
    BiConsumer接受两个不同类型的参数,但不返回任何结果的操作
    BiFunction<T,U,R>接受两个不同类型的参数,并返回一个其它类型的结果的操作
    BinaryOperator接受两个相同类型的参数,并返回一个同一类型的结果的操作
    BiPredicate<T,U>接受两个不同诶行的参数,且返回布尔类型的结果的操作
    BooleanSupplier不接受任何参数,且返回一个布尔类型的结果的操作
    Consumer接受一个参数,但不返回任何结果的操作
    DoubleBinaryOperator接受两个double类型的参数,并返回double类型结果的操作
    DoubleConsumer接受一个 double 类型的参数,但不返回任何结果的操作
    DoubleFunction接受一个double类型的参数,且返回一个 R 类型的结果的操作
    DoublePredicate接受两个double类型的参数, 且返回一个布尔类型的结果的操作
    DoubleSupplier不接受任何参数,但返回布尔类型的结果的操作
    DoubleToIntFunction接受两个double类型的参数,但返回一个int类型的结果的操作
    DoubleToLongFunction接受两个double类型的参数,但返回一个long类型的结果的操作
    DoubleUnaryOperator接受一个double类型的参数,且返回一个double类型的结果的操作
    Function<T,R>接受T类型的参数,且返回一个R类型结果的函数
    IntBinaryOperator接受两个int类型的参数,且返回一个int类型的结果的操作
    IntConsumer接受一个int类型的参数,但不返回任何结果的操作
    IntFunction接受一个int类型的参数,但返回一个 R 类型的结果的操作
    IntPredicate接受一个int类型的参数,但返回布尔类型的结果的操作
    IntSupplier不接受任何参数,但返回一个int类型的结果的操作
    IntToDoubleFunction接受一个int类型的参数,但返回一个double类型的结果的操作
    IntToLongFunction接受一个int类型的参数,但返回一long类型的结果的操作
    IntUnaryOperator接受一个int类型的参数,且返回一个int类型的结果的操作
    LongBinaryOperator接受两个long类型的参数,且返回一个long类型的结果的操作
    LongConsumer不接受任何参数,但返回一个long类型的结果的操作
    LongFunction接受一个long类型的参数,但返回一个R类型的结果的操作
    LongPredicate接受一个long类型的参数,但返回布尔类型的结果的操作
    LongSupplier不接受任何参数,但返回一个lon 类型的结果的操作
    LongToDoubleFunction接受一个long类型的参数,但返回一个double类型的结果的函数
    LongToIntFunction接受一个long类型的参数,但返回int类型的结果的函数
    LongUnaryOperator接受一个long类型的参数,并返回一个long类型的结果的操作
    ObjDoubleConsumer接受两个参数,一个为T类型的对象,另一个double类型,但不返回任何结果的操作
    ObjIntConsumer接受两个参数,一个为T类型的对象,另一个int类型,但不返回任何结果的操作
    ObjLongConsumer接受两个参数,一个为T类型的对象,另一个double类型,但不返回任何结果的操作
    Predicate接受一个指定类型T的参数,但返回布尔类型的结果的操作
    Supplier不接受任何参数,但返回一个T类型的结果的操作
    ToDoubleBiFunction<T,U>接受两个不同类型的参数,但返回一个double类型的结果的操作
    ToDoubleFunction一个接受指定类型T的参数,并返回一个double类型的结果的操作
    ToIntBiFunction<T,U>接受两个不同类型的参数,但返回一个int类型的结果的操作
    ToIntFunction接受指定类型T的参数,并返回一个int类型的结果的操作
    ToLongBiFunction<T,U>接受两个不同类型的参数,但返回一个long类型的结果的操作
    ToLongFunction接受指定类型的参数,并返回一个long类型的结果的操作
    UnaryOperator接受一个参数,并返回一个与参数类型相同的结果的操作

    函数式接口的使用

    Predicate

    package com.morris.java8.lamdba;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Predicate;
    
    public class PredicatExample {
    
        public static void main(String[] args) {
    
            List<Integer> integerList = Arrays.asList(1, 3, 5, 4, 8, 9);
    
            List<Integer> result = filterEvenNumber(integerList, i -> i % 2 == 0);
    
            System.out.println(result);
    
        }
    
        public static List<Integer> filterEvenNumber(List<Integer> integerList, Predicate<Integer> predicate) {
            List<Integer> result = new ArrayList<>();
            for (Integer integer : integerList) {
                if(predicate.test(integer)) {
                    result.add(integer);
                }
            }
            return result;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    Consumer

    package com.morris.java8.lamdba;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class ComsumerExample {
    
        public static void main(String[] args) {
            List<Integer> integerList = Arrays.asList(1, 3, 5, 4, 8, 9);
            integerList.forEach(System.out::println);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Function

    package com.morris.java8.lamdba;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Function;
    
    public class FunctionExample {
    
        public static void main(String[] args) {
            List<String> stringList = Arrays.asList("java", "hello", "world", "function");
            List<Integer> result = getLength(stringList, String::length);
            System.out.println(result);
        }
    
        public static List<Integer> getLength(List<String> stringList, Function<String, Integer> function) {
            List<Integer> integerList = new ArrayList<>();
            for (String s : stringList) {
                integerList.add(function.apply(s));
            }
            return integerList;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    函数式接口复合使用

    Predicate复合

    package com.morris.java8.lamdba;
    
    import com.morris.java8.collector.Dish;
    
    import java.nio.file.DirectoryStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Predicate;
    
    public class PredicateComplexExample {
    
        public static void main(String[] args) {
    
            List<Dish> dishList = Dish.createList();
    
            // 与-and
            // 找出卡路里>300的蔬菜
            Predicate<Dish> vegetablePredicate = Dish::isVegetarian;
            Predicate<Dish> moreThan300Predicate = d -> d.getCalories() >= 300;
            List<Dish> filter = filter(dishList, vegetablePredicate.and(moreThan300Predicate));
            System.out.println(filter);
    
            // 非-negate
            // 找出荤菜
            List<Dish> filter1 = filter(dishList, vegetablePredicate.negate());
            System.out.println(filter1);
    
            // 或-or
            // 找出卡路里大于300或者荤菜
            List<Dish> filter2 = filter(dishList, vegetablePredicate.or(moreThan300Predicate));
            System.out.println(filter2);
    
        }
    
        public static List<Dish> filter(List<Dish> dishList, Predicate<Dish> predicate) {
            List<Dish> result = new ArrayList<>();
            for (Dish dish : dishList) {
                if(predicate.test(dish)) {
                    result.add(dish);
                }
            }
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    Function复合

    package com.morris.java8.lamdba;
    
    import java.util.function.Function;
    
    public class FunctionComplexExample {
    
        public static void main(String[] args) {
    
            // andThen
            Function<Integer, Integer> f = x -> x + 1; // f(x)
            Function<Integer, Integer> g = x -> x * 2; // g(x)
            Function<Integer, Integer> andThen =  f.andThen(g); // g(f)=g(f(x))
    
            Integer apply = andThen.apply(1);
            System.out.println(apply);
    
            // compose
            Function<Integer, Integer> y = x -> x + 1; // y(x)
            Function<Integer, Integer> z = x -> x * 2; // z(x)
            Function<Integer, Integer> compose =  y.compose(z); // y(z)=y(z(x))
    
            Integer apply2 = compose.apply(1);
            System.out.println(apply2);
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    ArcGIS加载的各类地图怎么去除服务署名水印
    湖北移动中兴B860AV2.1_S905L_线刷固件包
    使用Python开发选课脚本
    Spring Cloud实战案例 │ Apollo和Zuul的整合开发
    LiveData源码赏析三 —— 常见问题
    学位英语短语
    架构篇(五)可扩展架构
    终于盼到了,Python 数据科学速查表中文版来了
    抽象工厂模式
    Win10文件资源管理器卡顿不流畅的解决方法
  • 原文地址:https://blog.csdn.net/u022812849/article/details/125467962