【译】Java8 之后对新开发者非常友好的特性

标签: 翻译 Java | 发表时间:2022-02-06 20:47 | 作者:
出处:http://crossoverjie.top/

原文链接

在这篇文章中,我将描述自 Java8 依赖对开发者来说最重要也最友好的特性,之所以选择 Java8 ,那是因为它依然是目前使用最多的版本。

具体可见这个调查报告:

Switch 表达式 (JDK 12)

使用 switch 表达式,你可以定义多个 case 条件,并使用箭头 -> 符号返回值,这个特性在 JDK12 之后启用,它使得 switch 表达式更容易理解了。

     
1
2
3
4
5
6
7
     
public String newMultiSwitch(int day) {
return switch (day) {
case 1, 2, 3, 4, 5 -> "workday";
case 6, 7 -> "weekend";
default -> "invalid";
};
}

在 JDK12 之前,同样的例子要复杂的多:

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     
public String oldMultiSwitch(int day) {
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
return "workday";
case 6:
case 7:
return "weekend";
default:
return "invalid";
}
}

文本块 (JDK 13)

文本块是一个多行字符串,可以避免使用转移字符;从 Java13 之后它成为了预览特性,使用 """ 符号定义。接下来看看使用它声明一个 JSON 字符串有多简单。

     
1
2
3
4
5
6
7
8
     
public String getNewPrettyPrintJson() {
return """
{
"firstName": "Piotr",
"lastName": "Mińkowski"
}
""";
}

Java13 之前的版本:

     
1
2
3
4
5
6
     
public String getOldPrettyPrintJson() {
return "{\n" +
" \"firstName\": \"Piotr\",\n" +
" \"lastName\": \"Mińkowski\"\n" +
"}";
}

新的 Optional Methods (JDK 9/ JDK 10)

Java 9/10 版本之后新增了几种可选方法,有意思的是这两个:

  • orElseThrow
  • ifPresentOrElse

使用 orElseThrow 当数据不存在时你能抛出 NoSuchElementException 异常,相反会返回数据。

     
1
2
3
4
     
public Person getPersonById(Long id) {
Optional<Person> personOpt = repository.findById(id);
return personOpt.orElseThrow();
}

正因为如此,可以避免在 isPresent 中使用 if 条件。

     
1
2
3
4
5
6
7
     
public Person getPersonByIdOldWay(Long id) {
Optional<Person> personOpt = repository.findById(id);
if (personOpt.isPresent())
return personOpt.get();
else
throw new NoSuchElementException();
}

第二个有趣的方法是 ifPresentOrElse ,当数据存在时,会执行带数据参数的函数,相反会执行参数为空的函数。

     
1
2
3
4
5
6
7
     
public void printPersonById(Long id) {
Optional<Person> personOpt = repository.findById(id);
personOpt.ifPresentOrElse(
System.out::println,
() -> System.out.println("Person not found")
);
}

在 Java8 中,你需要在 isPresent 方法中使用 if else 语句。

集合工厂方法(JDK 9)

使用 Java9 中的集合工厂方法可以简单的使用预定义数据创建不可变集合。

     
1
2
     
List<String> fruits = List.of("apple", "banana", "orange");
Map<Integer, String> numbers = Map.of(1, "one", 2,"two", 3, "three");

在 Java9 之前,你可以使用 Collections ,但肯定是更复杂:

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     
public List<String> fruits() {
List<String> fruitsTmp = new ArrayList<>();
fruitsTmp.add("apple");
fruitsTmp.add("banana");
fruitsTmp.add("orange");
return Collections.unmodifiableList(fruitsTmp);
}
public Map<Integer, String> numbers() {
Map<Integer, String> numbersTmp = new HashMap<>();
numbersTmp.put(1, "one");
numbersTmp.put(2, "two");
numbersTmp.put(3, "three");
return Collections.unmodifiableMap(numbersTmp);
}

Records (JDK 14)

使用 Records 你可以定义一个不可变、只能访问数据(只有 getter 方法) 的类,它可以自动创建 toString,equals,hashcode 方法。

     
1
     
public record Person(String name, int age) {}

以下效果与 Records 类似:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
      
public class PersonOld {
private final String name;
private final int age;
public PersonOld(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonOld personOld = (PersonOld) o;
return age == personOld.age && name.equals(personOld.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "PersonOld{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

接口中的私有方法 (JDK 9)

从 Java8 之后你就可以为接口创建默认方法,但从 Java9 的私有方法你就能充分使用该特性:

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
     
public interface ExampleInterface {
private void printMsg(String methodName) {
System.out.println("Calling interface");
System.out.println("Interface method: " + methodName);
}
default void method1() {
printMsg("method1");
}
default void method2() {
printMsg("method2");
}
}

局部变量类型推导 (JDK 10 / JDK 11)

从 Java10 之后你就能使用局部变量类型推导了,只需要使用 var 关键字来代替具体类型;在 Java11 之后你就能在 lambda 表达式中使用类型推导了。

     
1
2
3
4
     
public String sumOfString() {
BiFunction<String, String, String> func = (var x, var y) -> x + y;
return func.apply("abc", "efg");
}

相关 [java8 开发 友好] 推荐:

【译】Java8 之后对新开发者非常友好的特性

- - crossoverJie's Blog
在这篇文章中,我将描述自 Java8 依赖对开发者来说最重要也最友好的特性,之所以选择 Java8 ,那是因为它依然是目前使用最多的版本. 具体可见这个调查报告:. Switch 表达式 (JDK 12). 使用 switch 表达式,你可以定义多个 case 条件,并使用箭头 -> 符号返回值,这个特性在 JDK12 之后启用,它使得 switch 表达式更容易理解了.

Java8集合中的Lambda表达式

- - 四火的唠叨
文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》. 本文翻译自《 Java 8 Explained: Applying Lambdas to Java Collections》. Lambdas表达式是Java 8的主题,在Java平台上我们期待了很久. 但是,如果如果我们不在集合中使用它的话,就损失了很大价值.

Java8之使用新JS解释器Nashorn编译Lambda表达式

- - 并发编程网 - ifeve.com
原文链接  作者: Tal Weiss  CEO of  Takipi   译者:踏雁寻花,xbkaishui  校对:方腾飞. 在最近的一篇 文章中,我了解了一下Java8和Scala是如何实现 Lambda 表达式的. 正如我们所知道的,Java8不仅对javac编辑器做了很大改进,它还加入了一个全新的项目—Nashorn.

屌丝就爱尝鲜头——java8初体验 - laozhu1124

- - 博客园_首页
  Java8已经推出,让我们看看他的魅力.   Java8是由Oracle(甲骨文)公司与2014年3月27日正式推出的. Java8同时推出有3套语言系统,分别是Java SE8、Java SE Emebbled 8、Java ME8.   Java SE8较以往的系统增强的功能有:.   ①增强了对集合式操作语言——lambda表达式的支持,“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.

一种对开发更友好的前端骨架屏自动生成方案

- - SegmentFault 最新的文章
(马蜂窝技术原创内容,公众号 ID:mfwtech). 一份来自 Akamai 的研究报告显示,在对 1048 名网购户进行采访后发现:. 约 47% 的用户期望他们的页面在两秒之内加载完成. 如果页面加载时间超过 3s,约 40% 的用户会选择离开或关闭页面. 一直以来,为了提升用户在页面加载时的体验,无论是 Web 还是 iOS、Android 的应用中,前端开发工程师都做了许多工作.

10种用户友好的验证码

- Liang - cnBeta.COM
众所周知,验证码就是帮助我们确定答案不是由电脑自己生成的. 今天我推荐给大家10种用户体验绝佳、令人意想不到的验证码设计风格.

Java API 设计清单 « 友好的API

- - 东西
在设计Java API的时候总是有很多不同的规范和考量. 与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度. 就像飞行员起飞前的检查清单,这张清单将帮助软件设计者在设计Java API的过程中回忆起那些明确的或者不明确的规范. 本文也可以看作为“ API设计指南”这篇文章的附录. 我们还准备了一些前后比对的例子来展示这个列表如何帮助你理清设计需求,找出错误,识别糟糕的设计实践以及如何寻找改进的时机.

SEO实践(2)——让网站对搜索引擎友好

- - SEM WATCH
在该系列文章的第一篇中,提到SEO应该是以数据为基础的,并略为展开写了一些数据方面的准备工作. 数据虽然是非常重要的,但它扮演的角色只能是辅助:发现问题、总结改进、作为决策的参考因素等,但都无法脱离既有的SEO方法而独立存在. 而SEO的方法,应该分为两种或四种: 使网站对搜索引擎友好、使网站对搜索引擎的用户友好.

移动友好型网站将访客变为客户

- - Google 黑板报 - Google (谷歌)中国的博客网志,走近我们的产品、技术和文化
发表者:Masha Fisch, Google移动广告营销部. 身处一个连通无处不在的世界,用户希望在他们有需要时,尤其是他们在四处奔走时,找到想要的信息. 我们知道,他们在使用手机浏览网页时,也希望如此,所以我们进行了一项调查,以深入了解用户在使用手机上网时的期望与反应. 非常有趣的结果是,61%的用户指出,如果在某个移动网站上无法立即找到所需信息,他们会快速转向另一个网站.

5种关键元素让通知变友好

- - 互联网的那点事
你是否注意过,每天各种网页服务和APP的方式,会收到多少通知和警告信息. 这个问题越来越让人担忧,因为我们使用的服务在增多,但是我们的时间和注意力仍然有限. 我们白天接受这么多“嘀嘀嘀”和“弹出窗口”,我们不仅被分散了注意力,然后还要很辛苦地回到手头的事情上. 最终,我们将这些让人分心服务一忘皆空,或者尽可能对通知做出限制.