Lambda表达式

目录

一、lambda表达式

二、语法

1.无参数,无返回值

2.一个参数,无返回值

 3.一个参数,小括号可以省略不写

4.二个以上参数,有返回值,并且lambda体有多条语句

 5.Lambda 体中只有一条语句, return 和 大括号都可以省略不写

6.Lambda 表达式的参数列表的数据类型可以省略不写

三、函数式接口

四、方法的引用

1.类名::引用静态方法

2.对象名::引用成员方法

3.类::构造引用

4.数组::构造引用

五、Stream流


 

一、lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

 

二、语法

Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 Lambda 表达式拆分成两部分:

  • 左侧:Lambda 表达式的参数列表
  • 右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体

1.无参数,无返回值

代码如下(示例):

() -> System.out.println("Hello Lambda!");

2.一个参数,无返回值

代码如下(示例):

 (x) -> System.out.println(x)

 3.一个参数,小括号可以省略不写

代码如下(示例):

  x -> System.out.println(x)

4.二个以上参数,有返回值,并且lambda体有多条语句

代码如下(示例):

Comparator<Integer> com = (x, y) -> {
  	System.out.println("函数式接口");
   	return Integer.compare(x, y);
   };

 5.Lambda 体中只有一条语句, return 和 大括号都可以省略不写

代码如下(示例):

  Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

6.Lambda 表达式的参数列表的数据类型可以省略不写

因为JVM编译器通过上下文推断出,数据类型,即“类型推断”

代码如下(示例):

 (Integer x, Integer y) -> Integer.compare(x, y);

 

三、函数式接口

JDK8提供了大量常用的函数式接口以丰富Lambda的典型使用场景,主要在 java.util.function 包中。

1.消费型接口

java.util.function.Consumer<T> 接口与Supplier正好相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型参数决定。Consumer 接口中包含抽象方法 void accept(T t) ,意为消费一个指定泛型的数据。

public class ConsumerDemo {
	private static void consumeString(Consumer<String> function , String str) {
		function.accept(str);
		} 
		public static void main(String[] args) {
			printString(s ‐> System.out.println(s), "Xiyou");
	}
}

 

2.供给型接口

java.util.function.Supplier<T> 接口,它意味着"供给" , 对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。Supplier仅包含一个无参的方法: T get() 。用来获取一个泛型参数指定类型的对象数据。

public class SupplierDemo {
    //求数组元素最大值
	public static void main(String[] args) {
		int[] array = { 10, 20, 100, 30, 40, 50 };
		printMax(() ‐> {
			int max = array[0];
			for (int i = 1; i < array.length; i++) {
				if (array[i] > max) {
					max = array[i];
				}
			}
			return max;
		});
	}

	private static void printMax(Supplier<Integer> supplier) {
		int max = supplier.get();
		System.out.println(max);
	}
}

3.函数型接口

java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。有进有出,所以称为“函数Function”。Function 接口中最主要的抽象方法为: R apply(T t) ,根据类型T的参数获取类型R的结果。

public class FunctionDemo {
	private static void method(Function<String, Integer> function, Str str) {
		int num = function.apply(str);
		System.out.println(num + 20);
	}
	public static void main(String[] args) {
		method(s ‐> Integer.parseInt(s) , "10");
	}
}

4.断言型接口

有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用java.util.function.Predicate<T> 接口。Predicate 接口中包含一个抽象方法: boolean test(T t),用于条件判断的场景。

public class PredicateDemo {
	private static void method(Predicate<String> predicate,String str) {
		boolean veryLong = predicate.test(str);
		System.out.println("这个字符串长么:" + veryLong);
	}
	public static void main(String[] args) {
		method(s ‐> s.length() > 5, "HelloWorld");
	}
}

 

四、方法的引用

1.类名::引用静态方法

Lambda表达式: n -> Math.abs(n)

方法引用: Math::abs

 

2.对象名::引用成员方法

String str = "hello";

printStr(str::toUpperCase);

 

3.类::构造引用

Lambda表达式: wuqi -> new SunWukong(wuqi)

方法引用: SunWukong::new

 

4.数组::构造引用

Lambda表达式: length -> new int[length]

方法引用: int[]::new

 

五、Stream流

参考文章

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值