java-->lambda

lambda表达式,jdk1.8的特性,但是用的少,现在才总结以下,哎!还需努力啊...

import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
 * 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
 * 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
 * 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
 */
public class LambdaTest {

    public static void main(String[] args) {
        //1.lambda 表达式代替匿名内部类
        System.out.println("1-----------------");
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("内部类写法");
            }
        }).start();

        new Thread(() -> System.out.println("lambda表达式")).start();

        //2.lambda表达式对列表进行迭代
        System.out.println("2-----------------");
        List<String> list = Arrays.asList("java","c++","python","go");
        list.forEach(n -> System.out.println(n));

        //3.使用lambda表达式和函数式接口Predicate
        System.out.println("3-----------------");
        List<String> list1 = Arrays.asList("java","c++","python","go");
        Predicate<String> p1 = (n)->n.startsWith("j");
        Predicate<String> p2 = (n)->n.length() >= 4;
        list1.stream().filter(p1).forEach(n-> System.out.println(n));
        list1.stream().filter(n->n.startsWith("j")).forEach(n-> System.out.println(n));

        //4.Predicate之多个过滤条件
        System.out.println("4-----------------");
        list1.stream().filter(p1.and(p2)).forEach(n-> System.out.println(n));
        list1.stream().filter(p1.or(p2)).forEach(n-> System.out.println(n));

        //5.lambda表达式之map
        System.out.println("5-----------------");
        List<Double> list2 = Arrays.asList(30.0,50.0,80.0,100.0);
        list2.stream().map(n->n*0.2).forEach(n-> System.out.println(n));

        //6.lambda表达式之reduce()
        System.out.println("6---------------------");
        System.out.println(list2.stream().map(n->n*0.2).reduce((sum,n)->sum+n).get());

        //7.lambda表达式之collect()
        System.out.println("7---------------------");
        List<Double> result = list2.stream().filter(n->n>=50).collect(Collectors.toList());
        result.forEach(n-> System.out.println(n));

        //8.lambda表达式之distinct()去重
        System.out.println("8---------------------");
        List<String> list3 = Arrays.asList("java","c++","python","go","java","c++","python","go","go");
        List<String> result2 = list3.stream().filter(n->n.startsWith("j")).distinct().collect(Collectors.toList());
        result2.forEach(n-> System.out.println(n));

        //9.计算集合元素的最大值,最小值等
        System.out.println("9---------------------");
        DoubleSummaryStatistics result3 = list2.stream().mapToDouble(n->n).summaryStatistics();
        System.out.println(result3.getMax());
        System.out.println(result3.getMin());
        System.out.println(result3.getSum());
        System.out.println(result3.getAverage());
        System.out.println(result3.getCount());//个数

        //10.lambda表达式有个限制,那就是只能引用 final 或 final 局部变量,这就是说不能在lambda内部修改定义在域外的变量。

        System.out.println("10---------------------");
        int aa = 0;
        //list2.forEach(n-> System.out.println(aa++)); //Error:(79, 46) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
    }

}

对应打印结果

1-----------------
内部类写法
2-----------------
lambda表达式
java
c++
python
go
3-----------------
java
java
4-----------------
java
java
python
5-----------------
6.0
10.0
16.0
20.0
6---------------------
52.0
7---------------------
50.0
80.0
100.0
8---------------------
java
9---------------------
100.0
30.0
260.0
65.0
4
10---------------------
原文地址:https://www.cnblogs.com/cai170221/p/13577682.html