假设我们有一个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 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) 我有以下代码:
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)
不编译.我不确定这里需要什么.有帮助吗?
如果您使用 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 编写数据提供程序方法的更好方法
我有一个List<TestBuilder> testBuilders;
测试,它有一个测试类型的函数构建
我做到了testBuilders.stream().map(Test::build()).collect()
我想收集上面的array of Test i.e Test[]
我不确定里面会放什么collect function
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).
我试图通过使用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) 我想转换一个,Integer[]但是toArray()给了我Object[].我该怎么把它转换成String[]?
Stream.of(ids).map(String::valueOf).toArray();
Run Code Online (Sandbox Code Playgroud)