Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API

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

新语法

方法引用(Method references)

咱们来看个接口和一个方法java

public class TestMain {


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

    static String hello(int a,int b){
        return "";
    };
}

假设咱们这里要实现A接口
通常是直接内部类 或者新建一个类去实现android

//咱们日常的实现方法
        A a = new A() {

            @Override
            public String a(int a, int b) {

                return null;
            }
        };

那咱们来看看用”方法引用”的方式api

A a2 = TestMain::hello;

是否是很简洁?bash

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

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

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

再来看个案例gradle

List<String> data = Arrays.asList("2","1","4");
        //forEach后面会解释 你们主要看一下他的接口实现
        data.forEach(new Consumer<String>() {

            @Override
            public void accept(String t) {
            System.out.println(t);

            }
        });

再看看用新语法怎么实现ui

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介绍

相关文章
相关标签/搜索