栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java8 新特性之Lambda 表达式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java8 新特性之Lambda 表达式

 Lambda 表达式的基础语法:

语法格式一: 无参数无返回值 () -> System.out.println("Hello Java8 Lambda!");

语法格式二:有一个参数无返回值 (x) -> System.out.println(x);

语法格式三:有一个参数,小括号可以省略不写 x -> System.out.println("x");

语法格式四:有两个以上参数,有返回值,并且Lambda 体中有多条语句,要使用 {} 包裹起来 (x, y)-> {System.out.println(x); System.out.println(y);}

语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写Comparator com = (x, y)-> Integer.compare(x, y);

语法格式六:若 Lambda 表达式中的数据类型可以省略不写,因为 JVM 编译器通过上下文推断出,数据类型即“类型推断”

简单的使用实例一:

简单的使用实例二:实现字符串的处理

简单的使用实例三:实现实现员工信息的筛选

个人心得


Lambda 表达式的基础语法:

    Java8 引入了一个新的操作符 "->" 称为箭头操作符或者Lambda 操作符,箭头操作符将 Lambda 拆分成两部分
 左侧: Lambda 表达式的参数列表
 右侧: Lambda 表达式中所需要执行的功能,即 Lambda 体
    
左右遇一括号省   ==> 左侧只有一个参数,() 可以省略,右侧只有一条语句时,{}可以省略
左侧推断类型省   ==> 由于参数类型 JVM 可以推断出来,所以左侧的参数类型可以不写
能省则省

语法格式一: 无参数无返回值 () -> System.out.println("Hello Java8 Lambda!");
package test2;

import org.junit.Test;

public class TestLambda2 {
    @Test
    public void test1() {
        int num = 0;

        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello Java8 Lambda! " + num);
            }
        };

        r1.run();
        System.out.println("---------------------------------------------");

        Runnable r2 = () -> System.out.println("Hello Java8 Lambda! "+ num);
        r2.run();
    }
}

语法格式二:有一个参数无返回值 (x) -> System.out.println(x);
@Test
public void test2(){
    Consumer con = (x) -> System.out.println(x);
    con.accept("Java Lambda is so powerful!");
}

语法格式三:有一个参数,小括号可以省略不写 x -> System.out.println("x");
@Test
public void test2(){
    Consumer con = x -> System.out.println(x);
    con.accept("Java Lambda is so powerful!");
}

语法格式四:有两个以上参数,有返回值,并且Lambda 体中有多条语句,要使用 {} 包裹起来 (x, y)-> {System.out.println(x); System.out.println(y);}
@Test
public void test3(){
    Comparator com = (x, y)->{
        System.out.println("函数式接口");
        return Integer.compare(x, y);
    };
}

语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写Comparator com = (x, y)-> Integer.compare(x, y);
@Test
public void test4(){
    Comparator com = (x, y)-> Integer.compare(x, y);
}

语法格式六:若 Lambda 表达式中的数据类型可以省略不写,因为 JVM 编译器通过上下文推断出,数据类型即“类型推断”
Comparator com2 = (Integer x, Integer y)->Integer.compare(x, y);

简单的使用实例一:

对一个数进行简单的计算

1、首先写一个函数式的接口

@FunctionalInterface
public interface MyFun{
    public Integer getValue(Integer num);
}

2、将该接口变量和其要处理的变量类型共同作为参数,写一个实现方法

public Integer operation(Integer num, MyFun fun){
    return fun.getValue(num);
}

3、调用写好的函数,传入要处理的参数,接口变量写成 Lambda 表示式的形式

// 需求: 对一个数进行运算
@Test
public void test5(){
    Integer operation = operation(100, x -> x * x);
    System.out.println(operation);

    Integer operation1 = operation(200, y -> y + 200);
    System.out.println(operation1);
}

简单的使用实例二:实现字符串的处理

将字符串首位去掉空白字符、换成大写,字符串的截取


@FunctionalInterface
public interface MyFun {
    public String getValue(String str);
}
public String strHandler(String str, MyFun fun){
    return fun.getValue(str);
}

    
@Test
public void test2(){
    String handler = strHandler("ttn Java Lambda is very powerful!  ", str -> str.trim());
    System.out.println(handler);

    String handler1 = strHandler("ttn Java Lambda is very powerful!  ", str -> str.toUpperCase());
    System.out.println(handler1);

    String handler2 = strHandler("ttn Java Lambda is very powerful!  ", str -> str.substring(4, 33));
    System.out.println(handler2);
}

简单的使用实例三:实现 Long 类型数据的基础处理

@FunctionalInterface
public interface MyFun2 {
    public R getValue(T t1, T t2);
}
public void calculate(Long l1, Long l2, MyFun2 mf){
    System.out.println(mf.getValue(l1, l2));
}

@Test
public void test3(){
    calculate(100L, 200L, (x, y)->x+y);
    calculate(100L, 200L, (x, y)->x*y);
}

简单的使用实例三:实现员工信息的筛选
public class Employee {
    private String name;
    private Integer age;
    private Double salary;

    public Employee() {}

    public Employee(String name, Integer age, Double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + ''' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}
// 需求,获取当前公司中员工年龄大于 35的员工信息
List employees = Arrays.asList(
        new Employee("zhangsan", 18, 4000.20),
        new Employee("lisi", 35, 17000.50),
        new Employee("wangwu", 28, 25000.80),
        new Employee("maliu", 40, 25000.60),
        new Employee("guaijiaoqi", 18, 4000.30)
);

 将员工按照年龄进行排序,如果年龄相同,按照姓名进行排序

@Test
public void test1(){
    Collections.sort(this.employees, (e1, e2)->{
        if(e1.getAge().equals(e2.getAge())){
            return e1.getName().compareTo(e2.getName());
        }else{
            return Integer.compare(e1.getAge(), e2.getAge());
        }
    });

    for(Employee employee: this.employees){
        System.out.println(employee);
    }
}

个人心得

感觉Lambda 对于单个数据的处理这么写反而变得繁琐,单个数据处理可以简单的多,Lambda 的优势是在于多个数据的处理上,比如像 List、Map 这样的数据处理上。

上述内容来自于视频笔记:【Java】Java8新特性-Lambda表达式-Stream API等_尚硅谷__李贺飞_哔哩哔哩_bilibili

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/685330.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号