相关疑难解决方法(0)

Java 8数组构造函数引用如何工作?

假设我们有一个IntFunction返回整数数组的变量:

IntFunction<int[]> i;
Run Code Online (Sandbox Code Playgroud)

使用Java 8泛型,可以使用如下构造函数引用初始化此变量:

i = int[]::new
Run Code Online (Sandbox Code Playgroud)

Java编译器如何将其转换为字节码?

我知道对于其他类型,例如String::new,它可以使用invokedynamic指向String构造函数的指令java/lang/String.<init>(...),这只是一个具有特殊含义的方法.

这对数组有什么用处,看到有构造数组的特殊指令?

java arrays java-8 method-reference

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

为什么新的Java 8流在toArray调用上返回一个Object Array?

当我正在开发一个涉及Java 8新流的项目时,我注意到当我调用Stream#toArray()一个流时,它返回的是一个Object[]而不是一个T[].惊讶,因为我是,我开始挖掘到Java 8的源代码,但没有找到任何原因,他们没有实现Object[] toArray();T[] toArray();.这背后有什么理由,还是只是一致性?

编辑1:我在答案中注意到很多人说这是不可能的,但是这段代码片段会编译并返回预期的结果?

import java.util.Arrays;

public class Test<R> {

    private Object[] items;

    public Test(R[] items) {
        this.items = items;
    }

    public R[] toArray() {
        return (R[]) items;
    }

    public static void main(String[] args) {
        Test<Integer> integerTest = new Test<>(new Integer[]{
            1, 2, 3, 4
        });

        System.out.println(Arrays.toString(integerTest.toArray()));
    }

}
Run Code Online (Sandbox Code Playgroud)

java java-8

9
推荐指数
3
解决办法
6890
查看次数

Java 8 Streams - 收集可能为null的值

我有以下代码:

    private static <T> Map<String, ?> getDifference(final T a, final T b, final Map<String, Function<T, Object>> fields) {
    return fields.entrySet().stream()
            .map(e -> {
                final String name = e.getKey();
                final Function<T, Object> getter = e.getValue();
                final Object pairKey = getter.apply(a);
                final Object pairValue = getter.apply(b);
                if (Objects.equals(pairKey, pairValue)) {
                    return null;
                } else {
                    return Pair.of(name, pairValue);
                }
            })
            .filter(Objects::nonNull)
            .collect(Collectors.toMap(Pair::getKey, Pair::getValue));
    }
Run Code Online (Sandbox Code Playgroud)

现在,pairValue可以为null.为了避免这里描述的NPE ,在"收集"时,我希望确保只发送那些非空的值.如果为null,我想发送"".

所以,我尝试用这个替换最后一行:

.collect(Collectors.toMap(Pair::getKey,Optional.ofNullable(Pair::getValue).orElse(""));
Run Code Online (Sandbox Code Playgroud)

以及其他修改:

.collect(Collectors.toMap(pair -> pair.getKey(), Optional.ofNullable(pair -> pair.getValue()).orElse(""));
Run Code Online (Sandbox Code Playgroud)

不编译.我不确定这里需要什么.有帮助吗?

java hashmap java-8 keyvaluepair java-stream

6
推荐指数
2
解决办法
1671
查看次数

将列表转换为二维数组 Java 以用于 TestNG 数据提供程序

如果您使用 TestNG,您会发现要将方法用作数据提供者,您必须创建一个返回二维 Object 数组的方法。

因此,如果我有一个 List of (say) Students ,是否有任何实用方法可以将其转换为二维数组。

期待用这样的循环手动将其转换

 List<Student> studentList = getStudentList();

 Object [][] objArray = new Object[studentList.size][];

 for(int i=0;i< studentList.size();i++){
    objArray[i] = new Object[1];
    objArray[i][0] = studentList.get(i);
 } 

 return objArray;
Run Code Online (Sandbox Code Playgroud)

相反,我正在查看一个实用程序函数,如果任何库中都有可用的函数。

或者为 TestNG 编写数据提供程序方法的更好方法

java testng

5
推荐指数
2
解决办法
8358
查看次数

如何将流的结果收集到 Java 8 中的自定义对象数组中

我有一个List<TestBuilder> testBuilders; 测试,它有一个测试类型的函数构建

我做到了testBuilders.stream().map(Test::build()).collect()

我想收集上面的array of Test i.e Test[]

我不确定里面会放什么collect function

java arrays java-8 java-stream

5
推荐指数
2
解决办法
9375
查看次数

在流中使用过滤器

String[] arr={"121","4545","45456464"};
Arrays.stream(arr).filter(s->s.length()>4).toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

有人能告诉我上面的代码片段到底发生了什么 toArray(String[]::new).

java java-8 java-stream

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

使用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
查看次数

在Java 8中将Integer数组转换为String数组的最简单方法

我想转换一个,Integer[]但是toArray()给了我Object[].我该怎么把它转换成String[]

Stream.of(ids).map(String::valueOf).toArray();
Run Code Online (Sandbox Code Playgroud)

java java-8

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