关于Java8的更新
今是最新的消息,我总结了Java8中更新的功能。
因为有一件让我感到非常尴尬的事情,我的记忆有些模糊,无法理解…所以我在这里重新写下来,希望今后不再发生,绝对不会忘记。
首先,为了获得整体感和概述的目的…源代码也非常简洁。我计划在今后的另一篇文章中详细介绍每个更新。
如果您能够参考一下,我将不胜感激。
以下是Java7升级至Java8的主要功能
-
インターフェースのstaticメソッド
- インターフェースのstaticメソッド
-
- インターフェースのデフォルトメソッド
-
- finalの省略(実質的final)
-
- ラムダ式(() -> {})
-
- メソッド参照
-
- コンストラクター参照
-
- レシーバーパラメーター(メソッドの引数this)
-
- 日付時刻API
- StreamAPI
他 (tā) could be paraphrased in Chinese as:
– 他人 (tā
– 某人
– 这个人 (zhè ge
接口中的静态方法静态方法可以在接口上定义。
可以像下面的示例一样,在Main类中继承接口并调用静态方法。
public class Main implements A1{
public static void main(String[] args) {
System.out.println(A1.getValue());
}
}
interface A1 {
public static int getValue() {
return 1;
}
}
执行结果
1
接口的默认方法现在可以在接口中定义具体方法(非抽象方法),这被称为“默认方法”。
public class Main {
public static void main(String[] args) {
A a = new A();
System.out.println(a.getValue());
}
}
class A implements B1 {
}
interface B1 {
default public int getValue() {
return 3;
}
}
执行结果
3
最终的简略形式(实际上的最终形式)
在实际上是最终的(事实上是最终的)变量上不再需要加上final。
在Lambda表达式中使用的变量变成了实际上是最终的例子。
name变量变成了实际上是最终的(即使加上final修饰符也可以)。
public class Main {
public static void main(String[] args) {
String name = "Java!";
HelloJava g = a -> System.out.println("Hello " + name);
name = "World!"; //ここでコンパイルエラー
g.test(name);
}
}
interface HelloJava {
void test(String name);
}
执行结果
ラムダ式から参照されるローカル変数は、finalまたは事実上のfinalである必要があります
匿名函式(() -> {})可以将Lambda表达式传递给函数接口(只定义了一个抽象方法的接口)的变量赋值处。
使用匿名类的示例
public class Main {
public static void main(String[] args) {
B1 b = new B1();
b.test("Java");
}
}
class B1 implements A1 {
@Override
public void test(String n){
System.out.println("Hello " + n);
}
}
interface A1 {
void test(String name);
}
使用Lambda表达式的示例
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = (n) -> {
System.out.println("Hello " + n );
};
a.test(name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
优点使用函数式接口(只包含一个抽象方法的接口)的写法比使用匿名类(只使用一次的类)更加简洁。通过使用Lambda表达式,可以避免程序变得冗长,并能够将注意力集中于更加核心的部分。
方法引用可以将方法本身赋值给函数式接口(只定义了一个抽象方法的接口)的变量。这被称为”方法引用”。
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = System.out::println;
a.test("Hello " + name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
构造函数引用
与方法引用类似,构造函数也可以被赋值给函数式接口(定义了一个抽象方法)的变量。
这被称为”构造函数引用”。
public class Main implements A1{
public static void main(String[] args) {
System.out.println(A1.getValue());
}
}
interface A1 {
public static int getValue() {
return 1;
}
}
1
接口的默认方法现在可以在接口中定义具体方法(非抽象方法),这被称为“默认方法”。
public class Main {
public static void main(String[] args) {
A a = new A();
System.out.println(a.getValue());
}
}
class A implements B1 {
}
interface B1 {
default public int getValue() {
return 3;
}
}
执行结果
3
最终的简略形式(实际上的最终形式)
在实际上是最终的(事实上是最终的)变量上不再需要加上final。
在Lambda表达式中使用的变量变成了实际上是最终的例子。
name变量变成了实际上是最终的(即使加上final修饰符也可以)。
public class Main {
public static void main(String[] args) {
String name = "Java!";
HelloJava g = a -> System.out.println("Hello " + name);
name = "World!"; //ここでコンパイルエラー
g.test(name);
}
}
interface HelloJava {
void test(String name);
}
执行结果
ラムダ式から参照されるローカル変数は、finalまたは事実上のfinalである必要があります
匿名函式(() -> {})可以将Lambda表达式传递给函数接口(只定义了一个抽象方法的接口)的变量赋值处。
使用匿名类的示例
public class Main {
public static void main(String[] args) {
B1 b = new B1();
b.test("Java");
}
}
class B1 implements A1 {
@Override
public void test(String n){
System.out.println("Hello " + n);
}
}
interface A1 {
void test(String name);
}
使用Lambda表达式的示例
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = (n) -> {
System.out.println("Hello " + n );
};
a.test(name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
优点使用函数式接口(只包含一个抽象方法的接口)的写法比使用匿名类(只使用一次的类)更加简洁。通过使用Lambda表达式,可以避免程序变得冗长,并能够将注意力集中于更加核心的部分。
方法引用可以将方法本身赋值给函数式接口(只定义了一个抽象方法的接口)的变量。这被称为”方法引用”。
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = System.out::println;
a.test("Hello " + name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
构造函数引用
与方法引用类似,构造函数也可以被赋值给函数式接口(定义了一个抽象方法)的变量。
这被称为”构造函数引用”。
public class Main {
public static void main(String[] args) {
A a = new A();
System.out.println(a.getValue());
}
}
class A implements B1 {
}
interface B1 {
default public int getValue() {
return 3;
}
}
3
最终的简略形式(实际上的最终形式)
在实际上是最终的(事实上是最终的)变量上不再需要加上final。
在Lambda表达式中使用的变量变成了实际上是最终的例子。
name变量变成了实际上是最终的(即使加上final修饰符也可以)。
public class Main {
public static void main(String[] args) {
String name = "Java!";
HelloJava g = a -> System.out.println("Hello " + name);
name = "World!"; //ここでコンパイルエラー
g.test(name);
}
}
interface HelloJava {
void test(String name);
}
执行结果
ラムダ式から参照されるローカル変数は、finalまたは事実上のfinalである必要があります
匿名函式(() -> {})可以将Lambda表达式传递给函数接口(只定义了一个抽象方法的接口)的变量赋值处。
使用匿名类的示例
public class Main {
public static void main(String[] args) {
B1 b = new B1();
b.test("Java");
}
}
class B1 implements A1 {
@Override
public void test(String n){
System.out.println("Hello " + n);
}
}
interface A1 {
void test(String name);
}
使用Lambda表达式的示例
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = (n) -> {
System.out.println("Hello " + n );
};
a.test(name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
优点使用函数式接口(只包含一个抽象方法的接口)的写法比使用匿名类(只使用一次的类)更加简洁。通过使用Lambda表达式,可以避免程序变得冗长,并能够将注意力集中于更加核心的部分。
方法引用可以将方法本身赋值给函数式接口(只定义了一个抽象方法的接口)的变量。这被称为”方法引用”。
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = System.out::println;
a.test("Hello " + name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
构造函数引用
与方法引用类似,构造函数也可以被赋值给函数式接口(定义了一个抽象方法)的变量。
这被称为”构造函数引用”。
public class Main {
public static void main(String[] args) {
String name = "Java!";
HelloJava g = a -> System.out.println("Hello " + name);
name = "World!"; //ここでコンパイルエラー
g.test(name);
}
}
interface HelloJava {
void test(String name);
}
ラムダ式から参照されるローカル変数は、finalまたは事実上のfinalである必要があります
匿名函式(() -> {})可以将Lambda表达式传递给函数接口(只定义了一个抽象方法的接口)的变量赋值处。
使用匿名类的示例
public class Main {
public static void main(String[] args) {
B1 b = new B1();
b.test("Java");
}
}
class B1 implements A1 {
@Override
public void test(String n){
System.out.println("Hello " + n);
}
}
interface A1 {
void test(String name);
}
使用Lambda表达式的示例
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = (n) -> {
System.out.println("Hello " + n );
};
a.test(name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
优点使用函数式接口(只包含一个抽象方法的接口)的写法比使用匿名类(只使用一次的类)更加简洁。通过使用Lambda表达式,可以避免程序变得冗长,并能够将注意力集中于更加核心的部分。
方法引用可以将方法本身赋值给函数式接口(只定义了一个抽象方法的接口)的变量。这被称为”方法引用”。
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = System.out::println;
a.test("Hello " + name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
构造函数引用
与方法引用类似,构造函数也可以被赋值给函数式接口(定义了一个抽象方法)的变量。
这被称为”构造函数引用”。
public class Main {
public static void main(String[] args) {
B1 b = new B1();
b.test("Java");
}
}
class B1 implements A1 {
@Override
public void test(String n){
System.out.println("Hello " + n);
}
}
interface A1 {
void test(String name);
}
使用Lambda表达式的示例
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = (n) -> {
System.out.println("Hello " + n );
};
a.test(name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
优点使用函数式接口(只包含一个抽象方法的接口)的写法比使用匿名类(只使用一次的类)更加简洁。通过使用Lambda表达式,可以避免程序变得冗长,并能够将注意力集中于更加核心的部分。
方法引用可以将方法本身赋值给函数式接口(只定义了一个抽象方法的接口)的变量。这被称为”方法引用”。
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = System.out::println;
a.test("Hello " + name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
构造函数引用
与方法引用类似,构造函数也可以被赋值给函数式接口(定义了一个抽象方法)的变量。
这被称为”构造函数引用”。
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = (n) -> {
System.out.println("Hello " + n );
};
a.test(name);
}
}
interface A1 {
void test(String name);
}
Hello Java
优点使用函数式接口(只包含一个抽象方法的接口)的写法比使用匿名类(只使用一次的类)更加简洁。通过使用Lambda表达式,可以避免程序变得冗长,并能够将注意力集中于更加核心的部分。
方法引用可以将方法本身赋值给函数式接口(只定义了一个抽象方法的接口)的变量。这被称为”方法引用”。
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = System.out::println;
a.test("Hello " + name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
构造函数引用
与方法引用类似,构造函数也可以被赋值给函数式接口(定义了一个抽象方法)的变量。
这被称为”构造函数引用”。
public class Main {
public static void main(String[] args) {
String name = "Java";
A1 a = System.out::println;
a.test("Hello " + name);
}
}
interface A1 {
void test(String name);
}
执行结果
Hello Java
构造函数引用
与方法引用类似,构造函数也可以被赋值给函数式接口(定义了一个抽象方法)的变量。
这被称为”构造函数引用”。
Hello Java
与方法引用类似,构造函数也可以被赋值给函数式接口(定义了一个抽象方法)的变量。
这被称为”构造函数引用”。
只需一种选项,用中文将以下内容进行转述:使用java.util.function包中的Supplier接口。
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<B1> b = B1::new;
System.out.println(b.get().getName("Java"));
}
}
class B1 {
public String getName(String name) {
return "Hello " + name;
}
}
执行结果
Hello Java
接收器参数(方法的参数this)在方法的开头,可以指定this作为参数。
这被称为显式接收器参数(explicit receiver parameters)(在编译时的错误消息中被称为“显式this参数”)。
public class Main {
public static void main(String[] args) {
B1 b = new B1();
System.out.println(b.getName());
}
}
class B1 {
public String getName(B1 this) {
return "Hello Java";
}
}
运行结果
Hello Java
日期和时间API
引入了java.time.LocalDate类。该类的特点是不可变的。一旦字段的值被设定,之后该值就不会再被改变的对象。
它的优点包括以下几点:
-
そのオブジェクトの値が変更されたかどうかを確かめる必要がない。
Hello Java
这被称为显式接收器参数(explicit receiver parameters)(在编译时的错误消息中被称为“显式this参数”)。
public class Main {
public static void main(String[] args) {
B1 b = new B1();
System.out.println(b.getName());
}
}
class B1 {
public String getName(B1 this) {
return "Hello Java";
}
}
运行结果
Hello Java
日期和时间API
引入了java.time.LocalDate类。该类的特点是不可变的。一旦字段的值被设定,之后该值就不会再被改变的对象。
它的优点包括以下几点:
-
そのオブジェクトの値が変更されたかどうかを確かめる必要がない。
Hello Java
引入了java.time.LocalDate类。该类的特点是不可变的。一旦字段的值被设定,之后该值就不会再被改变的对象。
它的优点包括以下几点:
-
- そのオブジェクトの値が変更されたかどうかを確かめる必要がない。
-
- スレッドセーフである。
-
- データの複製を考える必要がない。
- 複数クライアントによるデータ共有が可能である。
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate a = LocalDate.of(2021, 4, 1);
LocalDate b = LocalDate.parse("2021-04-01");
System.out.println(a);
System.out.println(b);
}
}
执行结果
2021-04-01
2021-04-01
流API通过集合、数组、I/O资源等数据源,进行聚合操作的API。
流可以将某个处理结果作为下一个处理的数据源传递。因此,可以通过数据源对数据进行各种处理。
不使用流式处理的例子
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("bb", "aa", "cc");
for (int i=0; i<list.size(); i++) {
String str = list.get(i).toUpperCase();
list.set(i, str);
}
Collections.sort(list);
for(String str : list) {
System.out.print(str + " ");
}
System.out.println();
}
}
使用Stream的示例
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("bb", "aa", "cc");
list.stream().sorted().map(s -> s.toUpperCase()).forEach(s -> System.out.print(s + " "));
}
执行结果
AA BB CC
2021-04-01
2021-04-01
流可以将某个处理结果作为下一个处理的数据源传递。因此,可以通过数据源对数据进行各种处理。
不使用流式处理的例子
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("bb", "aa", "cc");
for (int i=0; i<list.size(); i++) {
String str = list.get(i).toUpperCase();
list.set(i, str);
}
Collections.sort(list);
for(String str : list) {
System.out.print(str + " ");
}
System.out.println();
}
}
使用Stream的示例
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("bb", "aa", "cc");
list.stream().sorted().map(s -> s.toUpperCase()).forEach(s -> System.out.print(s + " "));
}
执行结果
AA BB CC
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("bb", "aa", "cc");
for (int i=0; i<list.size(); i++) {
String str = list.get(i).toUpperCase();
list.set(i, str);
}
Collections.sort(list);
for(String str : list) {
System.out.print(str + " ");
}
System.out.println();
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("bb", "aa", "cc");
list.stream().sorted().map(s -> s.toUpperCase()).forEach(s -> System.out.print(s + " "));
}
执行结果
AA BB CC
AA BB CC
请用汉语将下述内容进行同意转述,只需提供一个答案:
I am learning Chinese because I want to be able to communicate with more people and have a better understanding of Chinese culture.