zoukankan      html  css  js  c++  java
  • Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API

    我正参加2016CSDN博客之星的比赛 希望您能投下宝贵的一票,点击进入投票

    新语法

    方法引用(Method references)

    我们来看个接口和一个方法

    public class TestMain {
    
    
        interface A{
            String a(int a,int b);
        }
    
        static String hello(int a,int b){
            return "";
        };
    }

    假设我们这里要实现A接口
    一般是直接内部类 或者新建一个类去实现

            //我们平常的实现方法
            A a = new A() {
    
                @Override
                public String a(int a, int b) {
    
                    return null;
                }
            };

    那我们来看看用”方法引用”的方式

    A a2 = TestMain::hello;

    是不是很简洁?

    来我们看看这种语法的规则
    AAA::BBB
    AAA指代某个类
    BBB指代某个方法
    BBB中的方法必须和你实现的接口回调的参数返回值一致

    就拿我们本例中的案例可以A接口中抽象方法 String a(int a,int b);
    我们可以看到这个返回值是—String 参数为—-int—-int

    然后再看看我们TestMain类下的String hello(int a,int b)方法
    返回值是—-String 参数是—int—int
    当使用 ‘方法引用’ 时候我自动传入参数

    再来看个案例

    List<String> data = Arrays.asList("2","1","4");
            //forEach后面会解释 大家主要看一下他的接口实现
            data.forEach(new Consumer<String>() {
    
                @Override
                public void accept(String t) {
                System.out.println(t);
    
                }
            });

    再看看用新语法怎么实现

    List<String> data = Arrays.asList("2","1","4");
        //forEach后面会解释 大家主要看一下他的接口实现
        data.forEach(System.out::printf);

    上面两个效果是一样的 都是输出 2 1 4
    System.out 是 java.lang.System.out中的一个类
    printf 是System.out中的一个方法
    我们来看下这个printf方法

        public void println(String x) {
            synchronized (this) {
                print(x);
                newLine();
            }
        }

    可以看到传入值一个字符串 返回值为void

    我们再来看下forEach中的匿名内部类

    data.forEach(new Consumer<String>() {
    
                @Override
                public void accept(String t) {
    
    
                }
            });

    传入的是一个String 返回的是void 所以正好可以使用System.out.println

    Lambda语法

    同样的看一个接口和他的实现方法
    接口:

    public class TestMain {
        interface A{
            String a(int a,int b);
        }
    }

    来看看吧我们实现的方法

            //我们平常的实现方法
            A a = new A() {
    
                @Override
                public String a(int a, int b) {
    
                    return null;
                }
            };

    Lambda语法实现

        //直接返回字一个字符串
            A a2 = (aa,b)->{return "";};
            //计算aa+b的数值 然后转化为字符串返回
            A a3 = (int aa,int b)->{String s=(aa+b)+"";return s;};
            //相当于直接返回
            A a4 = (int aa,int b)-> "我不想计算aa+b的值";
    
            //如果A接口中a方法没有参数也没有返回值假如抽象方法为void a();
            A a2 = ()->{};

    Lambda语法
    1. (aa,bb)->”“;
    aa 抽象方法的第一个参数 自动会按顺序赋值
    bb抽象方法的第二个参数 自动会按顺序赋值
    “” 抽象方法的返回值 相当于 return “”
    2. (int aa,float bb)->””
    aa 抽象方法的第一个参数并且类型为int 自动会按顺序赋值
    bb抽象方法的第二个参数并且类型为float自动会按顺序赋值
    “” 抽象方法的返回值 相当于 return “”
    这里的类型可以根据你的抽象方法确定
    3. (aa,bb)->{
    System.out.println(“嘿嘿传入的数值a = “+aa);
    return “”;
    }
    aa 抽象方法的第一个参数 自动会按顺序赋值
    bb抽象方法的第二个参数 自动会按顺序赋值
    {} 方法体可以在里面执行语句最后再返回
    4. (int aa,int bb)->{
    System.out.println(“嘿嘿传入的数值a = “+aa);
    return “”;
    }
    和”3”一样 只不过指定了参数
    5. ()->{ }
    抽象接口没有参数返回值为void

    案例1:
    原版:

    FileFilter java = new FileFilter() {
    
                @Override
                public boolean accept(File pathname) {
    
                    return false;
                }
            };

    lambda

        FileFilter java2 = (file)-> true;

    在android中的一个案例:

       ImageView iv  =(ImageView)findViewById(R.id.iv);
                iv.setOnClickListener(view -> {
                    Toast.makeText(this,"你的内容",Toast.LENGTH_SHORT).show();
                    Toast.makeText(this,"你的内容",Toast.LENGTH_SHORT).show();
                });

    Lambda语法在AndroidStudio中报错

    可以点击查看原文

    1.首先先项目根目录下的build.gradle中加入(注意加黑字)as2.0以后版本用3.4

    classpath 'me.tatarka:gradle-retrolambda:3.2.0'

    2.然后再module目录下的build.gradle中使用插件(放在第一行就行),加入

    apply plugin: 'me.tatarka.retrolambda'

    3.jmodule目录下的build.gradle中android语段中加入

    compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

    Stream API

    参考文献1
    此Api位于
    java.util.stream.Stream
    是以前集合list ArraysList等升级版 更高效的操作这里只教怎么用 具体大家可以看上面的连接

    1. 集合转为stream

      List<String> data = Arrays.asList("5","4","0","1");
      Stream<String> stream = data.stream();
    2. stream变为集合
        List<String> data = Arrays.asList("5","4","0","1");
            Stream<String> stream = data.stream();
            List<Object> asList = Arrays.asList(stream.toArray());
        List<String> data = Arrays.asList("5","4","0","1");
            Stream<String> stream = data.stream();
            stream.collect(Collectors.toList());

    关于collect 可以看下这篇文章
    collect介绍

  • 相关阅读:
    Desert King
    Dropping tests
    01分数规划小结
    简单的数学题
    [HAOI2016]放棋子
    [SDOI2017]数字表格
    诸侯放置
    LJJ爱数数
    车的放置
    [SDOI2014]数表
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152095.html
Copyright © 2011-2022 走看看