lambda

作者: shen33 | 来源:发表于2019-03-29 13:38 被阅读0次

    函数式接口

    Predicate

    Predicate<T>接口定义了一个名叫test的抽象方法,它接受泛型 T 对象,并返回一个boolean。这恰恰和你先前创建的一样,现在就可以直接使用了。在你需要表示一个涉及类型T的布尔表达式时,就可以使用这个接口。
    比如,你可以定义一个接受String 对象的Lambda表达式,如下所示。

    public class lambda1 {
    
        public static <T> List<T> filter(List<T> list, Predicate<T> p) {
            List<T> results = new ArrayList<>();
            for (T s : list) {
                if (p.test(s)) {
                    results.add(s);
                }
            }
            return results;
        }
    
        public static void main(String[] args) {
            Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
            List<String> list = Arrays.asList("a","","b","","c","");
            List<String> nonEmpty = filter(list, nonEmptyStringPredicate);
            System.out.println(nonEmpty);
        }
    
    }
    

    Consumer

    Consumer<T>定义了一个名叫accept的抽象方法,它接受泛型 T 的对象,没有返回(void)。你如果需要访问类型T的对象,并对其执行某些操作,就可以使用这个接口。
    比如,你可以用它来创建一个forEach方法,接受一个Integers的列表,并对其中每个元素执行操作。在下面的代码中,你就可以使用这个forEach方法,并配合Lambda来打印列表中的所有元素。

    public class lambda2 {
        public static <T> void forEach(List<T> list, Consumer<T> c) {
            for (T t : list) {
                c.accept(t);
            }
        }
        public static void main(String[] args) {
            forEach(Arrays.asList(1, 2, 3, 4, 5, 6), System.out::println);
        }
    }
    
    

    Function

    Function<T, R>接口定义了一个叫作apply的方法,它接受一个泛型 T 的对象,并返回一个泛型 R 的对象。如果你需要定义一个Lambda,将输入对象的信息映射到输出,就可以使用这个接口(比如提取苹果的重量,或把字符串映射为它的长度)。
    在下面的代码中,我们向你展示如何利用它来创建一个map方法,以将一个String列表映射到包含每个String长度的Integer列表。

    public class lambda3 {
    
        public static <T, R> List<R> map(List<T> list, Function<T, R> f) {
            List<R> result = new ArrayList<>();
            for (T t : list) {
                result.add(f.apply(t));
            }
            return result;
        }
    
        public static void main(String[] args) {
            List<Integer> list = map(Arrays.asList("java8", "lambda", "study"),
                    (String s) -> s.length());
    
            System.out.println(list);
        }
    }
    

    Supplier

    Supplier<T>接口定义了一个叫作get的方法,它接受一个泛型 T 的对象,并返回一个泛型 T 的对象。如果你需要定义一个Lambda,创建一个对象,就可以使用这个接口。

    public class Lambda {
        public static void main(String[] args) throws Exception {
            Supplier<Apple> supplier = () -> new Apple();
            Apple apple = supplier.get();
        }
    }
    class Apple {
        private String color;
        private int weight;
    
        public int getWeight() {
            return weight;
        }
    
        public void setWeight(int weight) {
            this.weight = weight;
        }
    
        public String getColor() {
    
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    }
    

    相关文章

      网友评论

          本文标题:lambda

          本文链接:https://www.haomeiwen.com/subject/mgwkbqtx.html