小编Dav*_*iel的帖子

Lambda表达式初始化数组

有没有办法使用简单的lambda表达式初始化数组或集合?

就像是

// What about this?
Person[] persons = new Person[15];
persons = () -> {return new Person()};
Run Code Online (Sandbox Code Playgroud)

要么

// I know, you need to say how many objects
ArrayList<Person> persons = () -> {return new Person()};
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

21
推荐指数
2
解决办法
1万
查看次数

为什么 java.time 对日期使用“of”而不是“new”?

在新的日期包的Java 8中,我们使用“更改日期()”到“LOCALDATE的。()”。

Date d = new Date(year, month, dayOfMonth);            //Old way
LocalDate d2 = LocalDate.of(year, month, dayOfMonth);  //new way
Run Code Online (Sandbox Code Playgroud)

当您想要一个新对象时,您通常使用new关键字。这是创建新对象的直观方式。

有时,当您需要延迟初始化的单例时,您可以使用静态方法来获取实例。在这种情况下,您必须调用它,getInstance()以便开发人员知道会发生什么。

这种新语法使代码不那么直观。它迫使您学习如何处理特定对象,而不是简单地使用它们。

这种变化有什么好的理由吗?

java date java-8 java-time

5
推荐指数
1
解决办法
274
查看次数

为什么 Java.NIO 使用静态方法?

我想知道为什么 java.nio 基于静态方法,我的意思是在 java.io 中创建一个文件然后使用他的方法,类似于:

File file = new File("myFile");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String readLine = bufferedReader.readLine();
Run Code Online (Sandbox Code Playgroud)

每个对象都有自己的方法。

java.nio 以不同的方式工作,您使用静态方法并强制您始终将文件作为参数传递。

Path file = Paths.get("myFile");
BufferedReader bufferedReader = Files.newBufferedReader(file);
String readLine = bufferedReader.readLine();

Path source = Paths.get("source");
Path target = Paths.get("target");
Files.copy(source, target);
Run Code Online (Sandbox Code Playgroud)

由于 nio 直接在类中提供了有用的方法(如 newBufferedReader),因此需要编写的代码更少。但它也可以在实例方法中完成,因此您不必将路径作为参数传递。

为什么会发生这种范式的变化?隐藏的优势是什么?

java nio

3
推荐指数
1
解决办法
96
查看次数

使用casted lambda表达式初始化数组

我试图通过使用lambda表达式实例化一个数组.

我试图使用的代码是:

public class Main {

    static int x = 0;

    public static void main(String[] args) {

        Test[] t = (Test[]) Stream
                .generate(() -> new Test(x++, 0))
                .limit(10)
                .map((Test v) -> {
                    v.a = v.a * 2;
                    return v;
                }) 
        );
Run Code Online (Sandbox Code Playgroud)

我试图实例化的类名为Test:

public class Test {

int a, b;

 Test(int a, int b) {
    this.a = a;
    this.b = b;
 }
}
Run Code Online (Sandbox Code Playgroud)

我无法执行演员表,它引发了一个例外:

java.lang.ClassCastException:[Ljava.lang.Object; 不能被投射到[Lperson.Test; at person.Main.main(Main.java:37)Java返回:1

但是如果你看一下对象类:

该数组是"[Ljava.lang.Object;" 例

//class "[Ljava.lang.Object;"
        System.out.println(
                Stream.generate(() -> new Test(x++, 0))
                .limit(10)
                .map((Test …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

1
推荐指数
1
解决办法
828
查看次数

通用参数可重用性

我有两种不同的方法

public static void printRoutes(List<Optional<String>> routes) {
    for (int i = 0; i < routes.size(); i++) {
        if(routes.get(i).isPresent()) {
            System.out.println("Output #" + (i+1) + ": "+routes.get(i).get());
Run Code Online (Sandbox Code Playgroud)

public static void printRoutes(List<Optional<Integer>> routes) {
    for (int i = 0; i < routes.size(); i++) {
        if(routes.get(i).isPresent()) {
            System.out.println("Output #" + (i+1) + ": "+routes.get(i).get());
Run Code Online (Sandbox Code Playgroud)

如您所见,它们基本相同,但参数类型相同。由于我只是打印它们,所以使用“ .toString()”方法,我认为应该有一种对两者使用相同方法的方法。

我尝试过

public static void printRoutes(List<Optional<T super Object>> lengths) 
Run Code Online (Sandbox Code Playgroud)

public static void printRoutes(List<Optional<T extends Object>> lengths) 
Run Code Online (Sandbox Code Playgroud)

但这是行不通的,有办法吗?否则您将无法使用泛型。

java generics java-8

1
推荐指数
1
解决办法
47
查看次数

标签 统计

java ×5

java-8 ×4

lambda ×2

date ×1

generics ×1

java-time ×1

nio ×1