Java8新特性Lambda表达式

Lambda表达式,又称闭包,Java8的新特性之一。

1、语法

(parameters) -> expression
或
(parameters) ->{ statements; }
  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数(圆括号):一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的执行功能(大括号):如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

2、简单使用

package com.geostar.geosmarter;
/**
 * Java8的Lambda表达式
 * 1、Lambda表达式需要函数式接口的支持
 * 2、函数式接口定义: 接口中只有一个抽象方法的接口,称为函数式接口。
 * 3、可以使用注解 @FuncitonalInterface 修饰,其修饰作用为:限定该接口必须为函数式接口,即该接口中有且只有一个抽象方法。否则无法通过编译。即可以检查是否为函数式接口。
 * */
public class Test10 {

	public static void main(String[] args) {
		// 无参数,有返回值
		Lambda_A a = () -> 5;
		System.out.println(a.operation());
		// 一个参数(参数的括号可写可不写),有返回值
		Lambda_B b = (x) -> 2 * x;
		System.out.println(b.operation(10));
		// 两个参数(数字),有返回值
		Lambda_C<Integer,Integer> c = (x, y) -> x - y;
		System.out.println(c.operation(20, 30));  
		// 接收2个int型整数,有返回值
		Lambda_D d = (int x, int y) -> x + y;
		System.out.println(d.operation(10, 20));
		// 无括号,无返回值
		Lambda_E e = (String s) -> System.out.println(s);
		e.operation("nihao");
		// 有括号,带返回值
		Lambda_F f = (String s) -> {
			System.out.println(s);
			return s + s;
		};
		System.out.println(f.operation("hello"));
	}
	
	interface Lambda_A {
	      int operation();
	}
	interface Lambda_B {
		int operation(int a);
	}
	interface Lambda_C<P,R> {
		R operation(P a,P b);
	}
	interface Lambda_D {
		int operation(int a,int b);
	}
	interface Lambda_E {
		void operation(String a);
	}
	interface Lambda_F {
		String operation(String a);
	}
}

3、Java内置四大核心接口

package com.geostar.geosmarter;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * Java内置四大核心接口
 * Consumer<T>  消费型接口 消费对象
 * 		void accept(T t);
 * Supplier<T>  供给型接口 生成对象
 * 		T get();
 * Function<R,T>  函数型接口 指定特定功能
 * 		R apply(T t);
 * Predicate<T>  断言型接口 进行条件判断
 * 		boolean test(T t); 
 * */
public class Test11 {
	public static void main(String[] args) {
		
		//消费型接口(有参,无返回值)
		Consumer<String> c = s -> System.out.println(s);
		c.accept("打印消费对象");
		//供给型接口(无参,有返回值)
		Supplier<List<Integer>> s = () -> {
			List<Integer> list = new ArrayList<>();
			list.add(1);
			list.add(2);
			list.add(3);
			return list;
		};
		List<Integer> list = s.get();
		System.out.println(list);
		//函数型接口(有参,有返回值)
		Function<String,String> f = param -> {
			return param.toUpperCase();
		};
		System.out.println(f.apply("abcd"));
		//断言型接口(有参,返回true或false)
		Predicate<Object> p = param -> {
			return param instanceof Integer;
		};
		System.out.println(p.test("aaa"));
		System.out.println(p.test(132));
	}
}

4、应用场景

4.1、流式数据过滤

package com.geostar.geosmarter;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Java8的Lambda表达式应用场景
 * */
public class Test12 {

	public static void main(String[] args) {
		//流式处理数据
		List<Integer> list = Arrays.asList(2,5,9,6,8,5,10,45,99,26,36);
		List<Integer> list1 = list.stream().filter(i -> i >= 5).collect(Collectors.toList());//筛选大于5的数
		System.out.println(list1);//[5, 9, 6, 8, 5, 10, 45, 99, 26, 36]
		List<Integer> list2 = list.stream().map(i -> i * i).collect(Collectors.toList());//转成平方列表
		System.out.println(list2);//[4, 25, 81, 36, 64, 25, 100, 2025, 9801, 676, 1296]
		Map<Boolean, List<Integer>> map = list.stream().collect(Collectors.groupingBy(i -> i % 2 == 0)); //根据奇偶性分组
		System.out.println(map);//{false=[5, 9, 5, 45, 99], true=[2, 6, 8, 10, 26, 36]}
		List<Integer> list3 = list.stream().filter(i -> i % 2 == 0).map(i -> i * i).distinct().collect(Collectors.toList());//复合操作
		System.out.println(list3);//[4, 36, 64, 100, 676, 1296]
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值