zoukankan      html  css  js  c++  java
  • lambda表达式

    快速入门

    1.初始化数据

    public class Demo1 {
        private ArrayList<Integer> arrayList = new ArrayList<Integer>();
    
        @Before
        public void config() {
            Random random = new Random();
            for (int i = 0; i < 100; i++) {
                arrayList.add(random.nextInt(100));
            }
        }
    }

    2.传统的排序

    @Test
        public void Method() {
            if (!arrayList.isEmpty()) {
                //传统方法
              Collections.sort(arrayList, new Comparator<Integer>() {
                    @Override
                    public int compare(Integer o1, Integer o2) {
                        return o1-o2;
                    }
                });
                for (Integer i : arrayList) {
                    System.out.println(i);
                }
    }

    3.使用lambda表达式

    查看sort方法的源码可得:

      该方法需要Comparator接口的实现

     public static <T> void sort(List<T> list, Comparator<? super T> c) {
            list.sort(c);
        }

    查看Comparator接口源码可得:

      compare方法需要传入两个比较的参数,返回int值

    @FunctionalInterface
    public interface Comparator<T> {
    int compare(T o1, T o2);
    ..... }

    所以lambda表达式为:

    Collections.sort(arrayList,(Integer a,Integer b)->{return  a-b;});

    JDK1.8 提供了很多函数接口

    1.断言型接口(Predicate)

    源码为:

    //表示该接口为函数接口
    @FunctionalInterface
    public interface Predicate<T> { boolean test(T t); ... }

    可得传入一个t返回一个Boolean

    例:

    //传入的a为Integer类型
    //a若>0返回true,反之为false
    Predicate<Integer> predicate = a->{if (a>0){ return true; }else{ return false; }};
    System.out.println(predicate.test(-1));

    console结果为

    D:javainjava.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:F:IntelliJ IDEA 2018.1.6libidea_rt.jar=2679:F:IntelliJ IDEA 2018.1.6in" -Dfile.encoding=UTF-8 -classpath "F:IntelliJ IDEA 2018.1.6libidea_rt.jar;F:IntelliJ IDEA 2018.1.6pluginsjunitlibjunit-rt.jar;F:IntelliJ IDEA 2018.1.6pluginsjunitlibjunit5-rt.jar;D:javajrelibcharsets.jar;D:javajrelibdeploy.jar;D:javajrelibextaccess-bridge-64.jar;D:javajrelibextcldrdata.jar;D:javajrelibextdnsns.jar;D:javajrelibextjaccess.jar;D:javajrelibextjfxrt.jar;D:javajrelibextlocaledata.jar;D:javajrelibext
    ashorn.jar;D:javajrelibextsunec.jar;D:javajrelibextsunjce_provider.jar;D:javajrelibextsunmscapi.jar;D:javajrelibextsunpkcs11.jar;D:javajrelibextzipfs.jar;D:javajrelibjavaws.jar;D:javajrelibjce.jar;D:javajrelibjfr.jar;D:javajrelibjfxswt.jar;D:javajrelibjsse.jar;D:javajrelibmanagement-agent.jar;D:javajrelibplugin.jar;D:javajrelib
    esources.jar;D:javajrelib
    t.jar;F:workspace_ideaoutproductionlambda;F:IntelliJ IDEA 2018.1.6libjunit-4.12.jar;F:IntelliJ IDEA 2018.1.6libhamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 cn.cg.Demo1,Method
    false
    
    Process finished with exit code 0

    2.消费型接口(Consumer)

    @FunctionalInterface
    public interface Consumer<T> {
        void accept(T t);
    ...
    }

    查看源码可得:

      接收t,返回void

    例:遍历List数组

      (1)传统方式

    arrayList.forEach(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) {
                        System.out.println("匿名实现类的方法"+integer);
                    }
                });

      (2)lambda表达式

     arrayList.forEach(a-> System.out.println(a));

    3.功能性接口(Function)

    @FunctionalInterface
    public interface Function<T, R> {
    
        R apply(T t);
    ...
    }

    传入t,返回R

    例:

      //字符串a是否与字符串-"123"相同
                Function<String, Boolean> f = a -> {
                    if ("123".equals(a)) {
                        return true;
                    } else {
                        return false;
                    }
                };
                System.out.println(f.apply("123"));

     4.其他函数接口

    供给型(Supplier)

    @FunctionalInterface
    public interface Supplier<T> {
    
        /**
         * Gets a result.
         *
         * @return a result
         */
        T get();
    }

    Comparator

    @FunctionalInterface
    public interface Comparator<T> {
    int compare(T o1, T o2);
    ...
    }

    等等.

    但凡打上注解:@FunctionalInterface都可作为函数接口

    自定义函数接口注意事项

    1.加上@FunctionalInterface注解

    2.接口中只有唯一的抽象方法,会被编译器默识别

    3.多余的抽象方法是object类中的方法,不影响

    4.其余方法必须加上default

    lambda表达式三种编写方法

    1.exexpression 单条语句表达式 

    2.statement       语句块

    3.rereference 方法引用

    前两种不多叙述

    方法引用

    1.实例方法的引用

    例:

    public String sayHello(String name){
            return name+": say hello";
        }
        @Test
        public void Method() {
            Demo2 d2 = new Demo2();
            Function<String,String> f = d2::sayHello;
            System.out.println( f.apply("jay"));
        }

    sayHello方法与Function接口的apply方法相一致;

    2.构造方法应用

    @Test
        public void Method() {
           Supplier supplier  = Demo2::new;
            System.out.println(supplier.get());
        }

    3.基于参数实例方法的引用

     @Test
        public void Method() {
            Comparator<Integer> compare = Integer::compare;
            System.out.println(compare.compare(111,111));
    
        }

    4.静态方法的引用

      @Test
        public void Method() {
            Function<Integer,String> f = String::valueOf;
            System.out.println(f.apply(100));
    
    
        }
  • 相关阅读:
    Catharanthus roseus(长春花碱)的生物合成
    论文好句积累
    C# OpenFileDialog用法
    JAVA配置环境变量的意义
    如何为织梦表单添加时间
    winform开发基础
    tomcat中jsp编译
    垂直居中——父元素高度确定的单行文本、父元素高度确定的多行文本
    水平居中——行内元素、定宽块、不定宽块
    批处理文件
  • 原文地址:https://www.cnblogs.com/cg961107/p/10947082.html
Copyright © 2011-2022 走看看