Java8新特性

1、Lambda表达式

Lambda是一个匿名函数,可以理解为一段可以传递的代码(将代码像数据一样传递);可以写出更简洁、更灵活的代码;作为一种更紧凑的代码风格,是Java语言表达能力得到提升。

匿名内部类:

@Test
public void test01(){
   
    //匿名内部类
    Comparator<Integer> comparator = new Comparator<Integer>() {
   
        @Override
        public int compare(Integer o1, Integer o2) {
   
            return Integer.compare(o1,o2);
        }

        @Override
        public boolean equals(Object obj) {
   
            return false;
        }
    };
    //调用
    TreeSet<Integer> set = new TreeSet<>(comparator);
}

Lambda写法:

@Test
public void test02(){
   
    // Lambda 表达式
    Comparator<Integer> comparator = (a, b) -> Integer.compare(a, b);

    TreeSet<Integer> set = new TreeSet<>(comparator);
}

Lambda语法:

  • 操作符:->
  • 左侧:参数列表
  • 右侧:执行代码块 / Lambda 体

口诀:

  • 写死小括号,拷贝右箭头,落地大括号
  • 左右遇一括号省
  • 左侧推断类型省

语法格式:
a、无参数,无返回值

例如 Runnable接口:
public class Test02 {
   
	int num = 10; //jdk 1.7以前 必须final修饰
    
    @Test
    public void test01(){
   
        // 匿名内部类
        new Runnable() {
   
            @Override
            public void run() {
   
                // 在局部类中引用同级局部变量
                // 只读
                System.out.println("Hello Lambda" + num);
            }
        };
    }

    @Test
    public void test02(){
   
        // 语法糖
     	Runnable runnable = () -> {
   
         	System.out.println("Hello Lambda");
     	};
    }
}

b、有一个参数,无返回值

@Test
public void test03(){
   
    // 一个参数,没有返回值
    Consumer<String> consumer = (a) -> System.out.println(a);
    consumer.accept("Hello Lambda!");

    // 一个参数,没有返回值(小括号可以省略不写)
    Consumer<String> consumer1 = a -> System.out.println(a);
    consumer1.accept("Hello Lambda!");
}

c、有两个及以上的参数,有返回值

// 有两个及以上的参数,有返回值(并且 Lambda 体中有多条语句)
Comparator<Integer> comparator = (a, b) -> {
   
    System.out.println("比较接口");
    return Integer.compare(a, b);
};

// 测试
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(2);
list.add(1);
System.out.println(list); // [3, 2, 1]
list.sort(comparator);
System.out.println(list); // [1, 2, 3]

// 有两个及以上的参数,有返回值,并且 Lambda 体中只有1条语句 (大括号 与 return 都可以省略不写)
Comparator<Integer> comparator = (a, b) -> Integer.compare(a, b);

2、函数式接口

java给我们提供了很多预置好的接口(各种参数和返回值),不用我们自己定义,方便使用。

函数式接口 参数类型 返回类型 用途
Consumer 消费型接口 T void 对类型为T的对象应用操作:void accept(T t)
Supplier 提供型接口 T 返回类型为T的对象:T get()
Function<T, R> 函数型接口 R void 对类型为T的对象应用操作,并返回结果为R类型的对象:R apply(T t)
Predicate 断言型接口 T boolean 确定类型为T的对象是否满足某约束,并返回boolean值:boolean test(T t)

a、Consumer 消费型接口(有去无回)

    @Test
    public void test01(){
   
        //Consumer
        Consumer<Integer> consumer = (x) -> System.out.println("消费型接口:" + x);
        //test
        consumer.accept(100);
    }

b、Supplier 提供型接口

没有参数,有返回
    @Test
    public void test02(){
   
        // Supplier
        Supplier<ArrayList<String>> supplier = () -> {
   
            ArrayList<String> list = new ArrayList<>();
            list.add("test");
         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值