java中lambda中使用三元,java中lambda表达式的使用

[最近Java 8的正式版已经推出,今天闲着没事就下载好了java 8 的jdk和jre来尝尝鲜。环境安装首先安装java 8的jdk 和 jre, 下载地址,安装好基础环境后, 可能对于稍微老一

lambda表达式在SE1.8中引入,与接口中的唯一的抽象方法相匹配,语法:(参数列表)->返回值,返回值也可以通过{}和return实现.

1.引入lambda之前,先对一个String列表进行排序

import java.util.*;

public class LambdaDemo1 {

public static void main(String[] args) {

List name = Arrays.asList("James", "Kobe", "Yao");

Collections.sort(name, new Comparator() {

public int compare(String s1, String s2) {

return s1.compareTo(s2);

}

});

}

}

静态方法Collections.sort接收一个list和一个Comparator接口作为输入参数,实现对输入的list中的元素进行比较并排序.通常可以用创建匿名Comparator对象,重写compare方法,并作为参数传递给sort方法.

如果使用lambda表达式,可以使代码更加简短易读:

Collections.sort(name, (String s1, String s2) -> {

return s1.compareTo(s2);

});

而且,它还可以更简短:

Collections.sort(name, (String s1, String s2) -> s1.compareTo(s2));

此段代码已经省略了{}和return,但是它还可以更短:

Collections.sort(name, (s1, s2) -> s1.compareTo(s2));

编译器能够自动识别参数类型,类型也可以省略不写.

2.函数式接口

一个函数式接口必须有且仅有一个抽象方法声明,可以通过@FunctionalInterface标识,每个与之对应的lambda表达式必须与此相匹配.任何一个只包含一个抽象方法的接口,都可以做成lambda表达式.例:

@FunctionalInterface

interface MapDemo {

V get(K k);

}

public class LambdaDemo2 {

public static void main(String[] args) {

MapDemo map = (k) -> Integer.valueOf(k);

System.out.println(map.get("10"));

}

}

考虑极端一点的话,我们可以将函数式接口中的方法定义为无参无返回值的,lambda同样可以相匹配:

@FunctionalInterface

interface MapDemo {

void get();

}

public class LambdaDemo2 {

public static void main(String[] args) {

MapDemo map = () -> {};

}

}

这里只是举个例子,在实际编程中并不实用.

3.lambda对方法及构造方法的引用

[Java 8已经发行两年多,但很多人仍然在使用JDK7。对企业来说,技术上谨慎未必是坏事,但对个人学习而言,不去学习新技术就很可能被技术抛弃。Java 8一个重要的变更是引入L

3.1.lambda可以通过关键字来获取方法的引用,可使第2节中的代码更加简短:

public class LambdaDemo3 {

public static void main(String[] args) {

MapDemo map = Integer::valueOf;

System.out.println(map.get("10"));

}

}

注意,此段代码中等号右边的Integer是指Integer.valueOf()方法返回值的类型,与上一节代码中的意义不同.

3.2.lambda也可以通过关键字new获取构造方法的引用,例:

class A {

String name;

public A() {

}

public A(String name) {

this.name = name;

}

}

interface AFactory {

T create(String name);

}

public class LambdaDemo3 {

public static void main(String[] args) {

AFactory afactory = A::new;

A a = afactory.create("name");

System.out.println(a.name);

}

}

通过A::new创建一个A类构造函数的引用.编译器会自动选择合适的构造函数来匹配A.create方法,并调用正确的构造函数.

4.lambda的可访问范围

4.1.访问局部变量,例:

public class LambdaDemo4 {

public static void main(String[] args) {

String s = "20";

MapDemo map = (k) -> Integer.valueOf(k + s);

System.out.println(map.get("10"));

}

}

虽然s不是final的,但此段代码是合法的,运行结果:1020.但下面的代码不合法:

String s = "20";

MapDemo map = (k) -> Integer.valueOf(k + s);

System.out.println(map.get("10"));

s="30";

可见,s在编译的时候被隐式的当做final变量来处理,在lambda内部改变s也是不可以的.

4.2.访问成员变量,例:

public class LambdaDemo4 {

String s1;

static String s2;

public void test() {

MapDemo map1 = (k) -> {

s1 = "100";

return Integer.valueOf(s1);

};

MapDemo map2 = (k) -> {

s2 = "200";

return Integer.valueOf(s2);

};

}

}

4.3.访问接口的静态方法和默认方法,例:

interface MapDemo {

V get(K k);

static void getStatic() {

}

default void getDefault() {

}

}

public class LambdaDemo4 {

public void test() {

MapDemo map1 = (k) -> {

MapDemo.getStatic();

return Integer.valueOf(k);

};

MapDemo map2 = (k) -> {

// MapDemo.getDefault();

return Integer.valueOf(k);

};

}

}

编译发现,静态方法在lambda表达式可以被访问,而默认方法是不可以的.

小结:java SE在1.8引入的lambda表达式实现了与函数式接口中方法的匹配,同时提供很多新的函数式接口,如Comparator等,使程序变得更加简短易读.[Lambda表达式主要是替换了原有匿名内部类的写法,也就是简化了匿名内部类的写法。lambda语法结构:(参数1,参数2...)->{重写方法的内容,不定义方法名}先看一个使用匿名内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 三元运算符 `condition ? value1 : value2` 的两个问号和两个冒号是没有特别的含义的,它们只是语法固定的符号。如果你看到了类似 `condition ?? value1 :: value2` 的表达式,那么这不是合法的 Java 代码。 在 Java ,双问号 `??` 和双冒号 `::` 是两个不同的运算符,它们分别用于 null 合并和方法引用。 双问号 `??` 运算符是 Java 8 新增的一个运算符,用于判断一个表达式是否为 null,如果为 null 则返回默认值。它的语法格式为 `expr1 ?? expr2`,其 `expr1` 是一个可能为 null 的表达式,`expr2` 是一个默认值。如果 `expr1` 不为 null,则返回 `expr1` 的值,否则返回 `expr2` 的值。 例如: ```java String str1 = null; String str2 = "Hello"; String result = str1 ?? str2; System.out.println(result); // 输出 "Hello" ``` 在上面的代码,由于 `str1` 为 null,所以 `result` 的值为默认值 `str2`,即输出 "Hello"。 双冒号 `::` 运算符是 Java 8 新增的一个运算符,用于表示方法引用。它的语法格式为 `Class::methodName` 或 `object::methodName`,其 `Class` 是一个类名,`object` 是一个对象名,`methodName` 是一个方法名。这种语法格式可以用于简化 lambda 表达式或方法引用的代码。 例如: ```java List<String> list = Arrays.asList("Java", "Python", "C++"); list.stream().forEach(System.out::println); ``` 在上面的代码,`list.stream().forEach(System.out::println)` 使用了双冒号运算符来引用 `System.out.println` 方法,这段代码等价于 `list.stream().forEach(s -> System.out.println(s))`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值