zoukankan      html  css  js  c++  java
  • 函数式接口的使用

    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Consumer;
    import java.util.function.Function;
    import java.util.function.Predicate;
    
    public class FunctionTest {
    
        /**
         * Predicate
         * java.util.function.Predicate<T>接口定义了一个名叫test的抽象方法,它接受泛型 T对象,并返回一个boolean。
         * 如果你去查Predicate接口的Javadoc说明,可能会注意到诸如and和or等其他方法。现在 你不用太计较这些,我们会在3.8节讨论
         * @param list
         * @param predicate
         * @param <T>
         * @return
         */
        public static <T> List<T> filter(List<T> list, Predicate<T> predicate){
            List<T> results = new ArrayList<>();
            for (T t : list) {
                if (predicate.test(t)){
                    results.add(t);
                }
            }
            return results;
        }
    
        /**
         * Consumer
         * java.util.function.Consumer<T>定义了一个名叫accept的抽象方法,它接受泛型T 的对象,没有返回(void)。
         * 你如果需要访问类型T的对象,并对其执行某些操作,就可以使用 这个接口。
         * List的forEach的的底层其实用到了 Consumer 这个函数式接口
         * @param list
         * @param consumer
         * @param <T>
         */
        public static <T> void forEachPrint(List<T> list, Consumer<T> consumer){
            for (T t : list) {
                consumer.accept(t);
            }
        }
    
        /**
         * java.util.function.Function<T, R>接口定义了一个叫作apply的方法,它接受一个 泛型T的对象,并返回一个泛型R的对象。
         * 如果你需要定义一个Lambda,将输入对象的信息映射 到输出,就可以使用这个接口。
         * @param list
         * @param function
         * @param <T>
         * @param <R>
         * @return
         */
        public static <T,R> List<R> map(List<T> list, Function<T,R> function){
            List<R> results = new ArrayList<>();
            for (T t : list) {
                R apply = function.apply(t);
                results.add(apply);
            }
            return results;
        }
    
    
    
        public static void main(String[] args) {
            /**
             *  Predicate的使用
             */
            List<String> list = new ArrayList<>();
            List<String> filter = FunctionTest.filter(list, (s -> !s.trim().isEmpty()));
    
            /**
             * Consumer的使用,打印还可以直接使用第二种方式
             */
            FunctionTest.forEachPrint(list,s -> {
                System.out.println(s);
            });
            FunctionTest.forEachPrint(list,System.out::println);
    
            /**
             * Function的使用
             * 输入字符串,得到字符串的长度
             */
            List<Integer> map = FunctionTest.map(list, s -> s.length());
            
        }
    
    }

    来源:《java8实战》

  • 相关阅读:
    自定义predicate来对List进行去重
    ParameterizedType
    万级TPS亿级流水-中台账户系统架构设计
    【Linux】【压测】基于python Locust库实现自动化压测实践
    家里宽带ADSL是城域网IP以及公网IP的具体区别和联系
    fiddler如何使用Xposed+JustTrustMe来突破SSL Pinning
    幽门螺旋杆菌检查方法那么多,到底选择哪个?
    apache (httpd)不支持中文路径问题
    皮肤瘙痒症、干燥瘙痒、荨麻疹和丘疹性荨麻疹区别和联系
    Redmi K30和Redmi K30 5G和Redmi K30 5G极速版和Redmi K30i 5G
  • 原文地址:https://www.cnblogs.com/Guhongying/p/15247228.html
Copyright © 2011-2022 走看看