lumbda表达式的几个例子(lumbda对集合遍历、过滤、转换、合并、创建、最大、最小、平均、总和值、并行流、将数组转换成流)

来源:互联网 发布:淘宝wifi营销系统 编辑:程序博客网 时间:2024/06/07 06:42


一、替代内部类

//原来创建Thread的方式    new Thread(new Runnable() {        @Override        public void run() {        System.out.println("test use lumbda expression");        }    }).start();            //将匿名内部类new Runnable改为lumbda形式创建    new Thread(() -> System.out.println("test use lumbda expression")).start();
运行结果:



二、遍历集合

 List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");        features.forEach(n -> System.out.println(n));

运行结果:


三、使用函数式接口Predicate

 //创建集合 List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");  //创建函数式接口Predicate,"->"左侧是参数名,"->"右侧是一个函数表达式 Predicate condition =(feature) -> ((String) feature).startsWith("D");  features.forEach(feature -> System.out.println(feature+"是否以D开头................."+condition.test(feature)));  System.out.println("\n\n\n\n以D开头的字符是................."); for(String feature:features){ if(condition.test(feature)){ System.out.println(feature); } }

运行结果:


四、使用多个函数式接口predicate作为判断条件

 //创建集合 List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");  //创建函数式接口Predicate,"->"左侧是参数名,"->"右侧是一个函数表达式 //以S开头 Predicate conditionStart =(feature) -> ((String) feature).startsWith("S"); //长度大于15 Predicate conditionLenght =(feature) -> ((String) feature).length() > 15 ; //多个predicate之间以and()、or()或者是xor()连接 Predicate condition = conditionStart.or(conditionLenght);  System.out.println("以S开头或者长度大于15的字符是................."); for(String feature:features){ if(condition.test(feature) ){ System.out.println(feature); } }
运行结果:


五、通过流API的map函数对数据的每一项进行转换

List<Integer> nums = Arrays.asList(100,200,300,400,500);  nums.stream().map((num) -> num + num*0.1) .forEach((num) -> System.out.println("数字增加10%后是:"+num));
运行结果:


六、通过流API的reduce函数对所有值合并成一个

List<String> nums = Arrays.asList("H","e","l","l","o"); String word = nums.stream() .reduce((sum,num) -> sum+num) .get(); System.out.println("字母是:"+word);

运行结果:


七、过滤集合

collect将过滤或变换等操作后的数据以集合的形式返回

 List<String> words = Arrays.asList("Hi","elephant","love","lucky","oppotunity","current","cuba","component");  List<String> newWords = words.stream() //字母中包含字母“c” .filter(word -> ((String) word).contains("c")) //字母的长度大于4,实现多重过滤 .filter(word ->((String) word).length() > 4) //将符合条件的数据以集合的形式返回 .collect(Collectors.toList()); System.out.println("\n\n\n\n包含字母c并且字母的长度大于4的字母集合是:"+newWords.toString());

运行结果:


八、通过distinct创建一个不包含重复元素的集合

// 用所有不同的数字创建一个正方形列表 List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4); //没有去掉重复值 List<Integer> newNumbers = numbers.stream().map( i -> i*i).collect(Collectors.toList());//去掉了集合中的重复元素 List<Integer> distinct = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList()); System.out.printf("Original List : %s,  new List : %s,  Square Without duplicates : %s %n", numbers, newNumbers,distinct);
运行结果:



九、通过summaryStatistics获取集合中元素的最大、最小、平均值以及总和

//获取数字的个数、最小值、最大值、总和以及平均值 List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29); IntSummaryStatistics statistics = primes.stream() .mapToInt(x -> x) .summaryStatistics();  System.out.println("Highest prime number in List : " + statistics.getMax()); System.out.println("Lowest prime number in List : " + statistics.getMin()); System.out.println("Sum of all prime numbers : " + statistics.getSum()); System.out.println("Average of all prime numbers : " + statistics.getAverage());

运行结果:


十、并行流

java8改善了多CPU系统的处理能力。将串行流转换为并行流Java 可在运行期自动协调多个 CPU 的运行。

方式一:通过集合调用parallelStream()方法

List<String> strs = Arrays.asList("parallelStream1","parallelStream2","parallelStream10","parallelStream13","parallelStream15","parallelStream55"); strs.parallelStream() .filter(str -> str.contains("1")) .forEach(str -> System.out.println("包含1的单词是。。。。。。。。。。"+str));
方式二:将集合转成stream,再调用stream的parallel()方法

strs.stream() .parallel() .filter(str -> str.contains("1")) .forEach(str -> System.out.println("包含1的单词是。。。。。。。。。。"+str));
运行结果:




十一、将数组转成流

方式一:通过Stream的of()方法

 String [] strs = {"parallelStream1","parallelStream2","parallelStream10","parallelStream13","parallelStream15","parallelStream55"}; Stream.of(strs) .filter(str -> str.contains("1")) .forEach(str -> System.out.println("包含1的单词是。。。。。。。。。。"+str));
方式二:通过Arrays的stream()方法

 Arrays.stream(strs) .filter(str -> str.contains("1")) .forEach(str -> System.out.println("包含1的单词是。。。。。。。。。。"+str));






注:代码运行在eclipse所写的java工程中

参考资料:https://wizardforcel.gitbooks.io/java8-tutorials/content/Java%208%20lambda%20%E8%A1%A8%E8%BE%BE%E5%BC%8F10%E4%B8%AA%E7%A4%BA%E4%BE%8B.html

https://wizardforcel.gitbooks.io/java8-tutorials/content/Java%208%20%E6%96%B0%E7%89%B9%E6%80%A7%E4%B9%8B%E6%97%85%20%E4%BD%BF%E7%94%A8%20Stream%20API%20%E5%A4%84%E7%90%86%E9%9B%86%E5%90%88.html


0 0