开发者社区> 程序员鱼丸> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)

简介: Java 8 中的新特性,虽然现在都出到了Java14版本,不过在日常的开发过程中,8的版本是足够使用了,再说现在的8以上的版本也都面向商业收费了,很多新手,我所接触到的,像我那时候一样,追求船新版本,一上来就去学`java14`的东西,当成一个爱好还行,重心还是要放在实用上
+关注继续查看

最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)

在这里插入图片描述

简介

Java 8 中的新特性,虽然现在都出到了Java14版本,不过在日常的开发过程中,8的版本是足够使用了,再说现在的8以上的版本也都面向商业收费了,很多新手,我所接触到的,像我那时候一样,追求船新版本,一上来就去学java14的东西,当成一个爱好还行,重心还是要放在实用上

过滤

需求:我需要过滤高考分数大于500的人

首先,新建一个内部类

    static class Student{
        private String name;
        private Integer score;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name!=null ? name.trim() : null;
        }

        public Integer getScore() {
            return score;
        }

        public void setScore(Integer score) {
            this.score = score;
        }

        public Student(String name, Integer score) {
            this.name = name;
            this.score = score;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", score=" + score +
                    "}\n";
        }
    }

使用IntStream遍历快速初始化一批值

    public static void main(String[] args) {
      List<Student> studentList =  IntStream.rangeClosed(0,20)
                .mapToObj(i -> new Student("Java Pro"+i,490+i))
                .collect(Collectors.toList());
    }

过滤出分数大于500的并输出

        List<Student> studentGiao = studentList.stream()
              .filter(student -> student.score > 500)
              .collect(Collectors.toList());
        System.out.println(studentGiao.toString());

输出:

[Student{name='Java Pro11', score=501}
, Student{name='Java Pro12', score=502}
, Student{name='Java Pro13', score=503}
, Student{name='Java Pro14', score=504}
, Student{name='Java Pro15', score=505}
, Student{name='Java Pro16', score=506}
, Student{name='Java Pro17', score=507}
, Student{name='Java Pro18', score=508}
, Student{name='Java Pro19', score=509}
, Student{name='Java Pro20', score=510}
]

日常求和

需要考虑到为空和为0的情况

package com.github.gleans;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class LambdaLearning {
    public static void main(String[] args) {
        List<Double> nums = Arrays.asList(1.01, 2.11, 3.23, 4.222, null, 5.6);
        double resNum = nums.stream()
                .map(num -> Objects.isNull(num) ? 0 : num)
                .mapToDouble(num -> num)
                .sum();
        System.out.println(resNum);
    }
}

map是重新指向一个对象,把->右侧的对象赋予,此处判断若num为null则赋予0值
注意,这里不可给null使用filter过滤掉,否则全为null的情况,会报空指针异常

扩展计算

    public static void testTwo(){
        List<Double> nums = Arrays.asList(1.01, 2.11, 3.23, 4.222, null, 5.6);
        DoubleSummaryStatistics number = nums.stream()
                .map(num -> Objects.isNull(num) ? 0 : num)
                .mapToDouble(num -> num)
                .summaryStatistics();
        System.out.println("最大值:"+number.getMax());
        System.out.println("最小值:"+number.getMin());
        System.out.println("平均值:"+number.getAverage());
    }

输出

最大值:5.6
最小值:0.0
平均值:2.6953333333333336

reduce简单使用

    public static void main(String[] args) {
        testOne();
    }

    public static void testOne(){
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
        // 这里的 10 相当于初始值
        int sum = numbers
                .stream()
                .reduce(10, Integer::sum);
        System.out.println(sum);
    }

Collectors.groupingBy

根据年龄分组

package com.github.gleans;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class SumWage {
    public static void main(String[] args) {
        List<UserDemo> userDemoList = new ArrayList<UserDemo>() {{
            add(new UserDemo(20, "jason", BigDecimal.valueOf(1000000)));
            add(new UserDemo(22, "yasuo", BigDecimal.valueOf(2000000)));
            add(new UserDemo(22, "ekko", BigDecimal.valueOf(100)));
        }};
        Map<Integer, List<UserDemo>> UserDemoMapByAge = userDemoList.stream()
                .collect(Collectors.groupingBy(UserDemo::getAge));
        System.out.println(UserDemoMapByAge.toString());
    }

    static class UserDemo {
        private int age;
        private String username;
        private BigDecimal wage;

        public UserDemo(int age, String username, BigDecimal wage) {
            this.age = age;
            this.username = username;
            this.wage = wage;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public BigDecimal getWage() {
            return wage;
        }

        public void setWage(BigDecimal wage) {
            this.wage = wage;
        }

        @Override
        public String toString() {
            return "UserDemo{" +
                    "age=" + age +
                    ", username='" + username + '\'' +
                    ", wage=" + wage +
                    '}';
        }
    }
}

输出

{20=[UserDemo{age=20, username='jason', wage=1000000}], 22=[UserDemo{age=22, username='yasuo', wage=2000000}, UserDemo{age=22, username='ekko', wage=100}]}

json化观看观看更为直观

{
    20:[
        {
            "age":20,
            "username":"jason",
            "wage":1000000
        }
    ],
    22:[
        {
            "age":22,
            "username":"yasuo",
            "wage":2000000
        },
        {
            "age":22,
            "username":"ekko",
            "wage":100
        }
    ]
}

进阶计算 Collectors.summarizingDouble

Map<Integer, DoubleSummaryStatistics> userAvgWageByAge = userDemoList.stream()
                .collect(Collectors.groupingBy(UserDemo::getAge, Collectors.summarizingDouble(s -> s.getWage().doubleValue())));

userAvgWageByAge.forEach((k, v) -> System.out.println(String.format("年龄:%d,平均工资:%f", k, v.getAverage())));

数组快速转为List

Stream.of(1, 2, 3, 4).collect(Collectors.toList())

结论

后续会学习更多关于Lambda的操作,日积月累...一定会成为一个秃头的程序猿

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java 8 新特性:Lambda 表达式
Java 8 新特性:Lambda 表达式
33 0
Java8新特性-Lambda表达式
Lambda表达式简化了我们代码开发,使得我们开发的代码看起来更加的简洁,所以我们需要学习这种更加规范、更加简洁的代码格式。
18 0
Java8.0新特性之Lambda表达式
  好程序员Java教程分享Java8.0新特性之Lambda表达式:Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级。本篇文章,主要给大家介绍的是lambda表达式。 Lambda表达式 Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。
800 0
好程序员分享java8新特性之Lambda表达式
好程序员分享java8新特性之Lambda表达式 ⼀、Lambda表达式简介 什么是Lambda? Lambda表达式是Java 8推出的⼀个新特性。从本质上讲,Lambda表达式是⼀个匿名函数。 为什么要使⽤Lambda? 使⽤Lambda表达式可以对⼀个接⼝进⾏⾮常简洁的实现。
1406 0
Java8新特性之一:Lambda表达式
Java8新特性之一:Lambda表达式Java8是自java5之后最重大的一次更新,它给JAVA语言带来了很多新的特性(包括编译器、类库、工具类、JVM等),其中最重要的升级是它给我们带来了Lambda表达式和Stream API。
1094 0
java8新特性(二)_lambda表达式
最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看《写给大忙人看的JavaSE8》.这里我会结合书中的知识以及网上的知识,对于java8 的新特性进行总结,当然我自己写的也会有自己的侧重点。
1391 0
Java 8 新特性(一)lambda表达式
Java 9 好像也快出了,不过我连Java 8的新特性都还没认真研究过,所以这几篇文章就是来介绍Java 8的新特性的。首先,第一个重要的特性就是传说中的lambda表达式了,虽然初学可能觉得这东西很难理解,但是一旦学会了,你就会发现离不开它了。
645 0
Java 8 新特性之 Lambda表达式
Lambda的出现就是为了增强Java面向过程编程的深度和灵活性。今天就来分享一下在Java中经常使用到的几个示例,通过对比分析,效果应该会更好。 – 1、实现Runnable线程案例 其存在的意义就是用Lambda来代替匿名类,如下: // before java 8...
972 0
五分钟带你玩转多线程(一)java多线程基础知识简介
线程概念 进程:是一个执行中的程序,如打开网易云音乐,网易云音乐就是一个进程 线程:是进程的组成,一个进程包含多个线程,是jvm最小调度单元。如网易云音乐听歌是一个线程,评价是一个线程。
56 0
18
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载