【发布时间】:2014-11-15 22:24:17
【问题描述】:
这与one 的问题几乎相同,但方向相反。
我知道 Java 8 中没有 FloatStream,float[] 的用例也不多,但我有一个:
在JavaFX 3D 中处理TriangleMesh,您必须为整个网格顶点的3D 坐标提供ObservableFloatArray。
作为一些计算的结果,我会将所有这些坐标都放在List 中,并将它们一次添加到网格中,我将调用triangleMesh.getPoints().addAll(),使用以下方法之一:
- addAll(ObservableFloatArray src)
- addAll(float... 元素)
- addAll(ObservableFloatArray src, int srcIndex, int length)
- addAll(float[] src, int srcIndex, int length)
其中ObservableFloatArray 可以使用FXCollections.observableFloatArray()、FXCollections.observableFloatArray(ObservableFloatArray array) 或FXCollections.observableFloatArray(float... values) 创建。
假设我对每个顶点都有这个 pojo:
private class Vertex {
private final float x;
private final float y;
private final float z;
public Vertex(float x, float y, float z){
this.x=x; this.y=y; this.z=z;
}
public float[] getCoordenates(){
return new float[]{x,y,z};
}
}
在执行一些计算后,我得到了List<Vertex> listVertices。我需要生成float[] arrayVertices 才能最终调用triangleMesh.getPoints().addAll(arrayVertices);。
现在这就是我正在做的事情:
listVertices.forEach(vertex->triangleMesh.getPoints().addAll(vertex.getCoordenates()));
但这会在添加到可观察数组的每个新顶点上触发关联的侦听器,并且对于大量顶点,这会影响性能。
如果FloatStream 和flatMapToFloat() 存在,我会这样做:
float[] arrayVertices = listVertices.stream()
.map(vertex->FloatStream.of(vertex.getCoordenates()))
.flatMapToFloat(f->f).toArray();
triangleMesh.getPoints().addAll(arrayVertices);
就像我实际上对面部索引的 int[] 列表所做的那样:
int[] arrayFaces = listFaces.stream()
.map(face->IntStream.of(face.getFaceIndices()))
.flatMapToInt(i->i).toArray();
triangleMesh.getFaces().addAll(arrayFaces);
但据我所知,没有办法使用流。
提前感谢任何涉及流的可能解决方案。
【问题讨论】: