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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值