Java8 --- lambda表达式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wxy540843763/article/details/80640763

1.  什么是lambda表达式?

    官方解释:一个不用背绑定到一个标识符上,并且可能被调用的函数。

    其他解释:一段带有输入参数的执行代码块。

 

2.  怎么用?

public static void main(String[] args) {

        TreeSet<String> treeSet = new TreeSet(new Comparator<String>() {

            @Override

            public int compare(String o1, String o2) {

                return o1.compareToIgnoreCase(o2);

            }

        });

       

        treeSet.add("fangxiaobai");

        treeSet.add("wangsu");

        treeSet.add("fanghengyu");

   

        TreeSet<String> treeSet1 = new TreeSet <>(( o1, o2) ->

            o1.compareToIgnoreCase(o2)

        );

   

        treeSet1.add("fangxiaobai");

        treeSet1.add("wangsu");

        treeSet1.add("fanghengyu");

       

        System.out.println(treeSet);

        System.out.println(treeSet1);

    }

 输出结果是:

[fanghengyu, fangxiaobai, wangsu]

[fanghengyu, fangxiaobai, wangsu]

 

为什么?

Java8的lambda表达式给我提供了创建SAM(Single Abstract Method)接口更加简单的语法糖。

 

1.  语法详解:

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {

        statment1;

        statment2;

        //.............

        return statmentM;

}

这种是最全的一种。由于编译器可以帮我推断出参数累型,所以我们可以去掉参数类型。

(param1,param2, ..., paramN) -> {

  statment1;

  statment2;

  //.............

  return statmentM;

}

当只有一个形参的时候,还可以省略小括号。

param1 -> {

  statment1;

  statment2;

  //.............

  return statmentM;

}

当lambda表达式只有一条语句的时候,还可以省略大括号。

param1 -> statment

还可以使用Method Reference。

List<String> names = new ArrayList <>();

        names.add("Fangxiaobai");

        names.add("FangHengyu");

        names.add("WangSu");

        List<String> lowercaseName = names.stream().map(String::toLowerCase).collect(Collectors.toList());

        System.out.println(lowercaseName);

上面这个程序的输出结果是:

[fangxiaobai, fanghengyu, wangsu]

 

以上的例子中,都是在演示lambda的基本用法。替换接口的匿名实现类。而Method Reference的这个例子中还演示了stream的一种用法。

下面来演示一下:使用lambda表达式来访问外部的对象。---捕获(capture

//demo3

        ArrayList <String> arrayList = new ArrayList <>();

        arrayList.add(" xiaobai ");

        arrayList.add(" susu  ");

        for(String s : arrayList) {

            Stream.of(arrayList).map(item->s.length()+"   ").forEach(System.out::print);

            Stream.of(arrayList).map(item->s.trim()).forEach(System.out::println);

        }

输出结果:

9   xiaobai    //后面没有空格了!

7   susu  //后面没有空格了!

 

解释一下:

    记得以前使用匿名内部类的时候,内部类可以引用外类的变量,但是变量必须是final类型。Lambda也是这样,不过lambda是隐式将其当成final类型了。

    但是,如果你在lambda表达式中使用了基本数据类型,那就会报错了。自己可以试一下。

    据说这是java8的一个小优化,将引用类型隐式的声明为final。

 

2.  方法引用:

objectName::instanceNameè System.out::println 相当于 x->Sout(x)

ClassName:staticMethodNameè Math:max 相当于Math.max(x,y)

ClassName:instanceNameè String::toLowerCase 相当于 x->x.tolowerCase();

3.  构造器引用

ClassName::new  èBigDecimal::new 相当于 x->new BigDecimal();

 

好了 lambda表达式就是这些。。。

 

二、Stream

Stream 在java中的定义是:

    A sequence of elements supporting sequentialand parallel aggregate operations.

1.  Stream 是元素的集合,

2.  可以支持顺序和并行的对员Stream进行聚合的操作。

 

可以把Stream当做是一个高级版本的Iterator,它可以对其包含的元素什么操作,比”过滤掉长度大于10的字符串”,”获取每个字符串的首字母”。

List<Integer> nums = new ArrayList();

        nums.add(1);

        nums.add(2);

        nums.add(3);

        nums.add(null);

        nums.add(4);

        nums.add(null);

        long count = nums.stream().filter(num -> num != null).count();

        System.out.println(count);

输出结果:

4


猜你喜欢

转载自blog.csdn.net/wxy540843763/article/details/80640763