- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我有一些使用 Java 8 流的代码,而且它可以工作。它做的正是我需要它做的,而且清晰易读(这在函数式编程中很少见)。在子例程结束时,代码遍历自定义对类型的列表:
// All names Hungarian-Notation-ized for SO reading
class AFooAndABarWalkIntoABar
{
public int foo_int;
public BarClass bar_object;
....
}
List<AFooAndABarWalkIntoABar> results = ....;
这里的数据必须作为数组传递到程序的其他部分,所以它们被复制出来:
// extract either a foo or a bar from each "foo-and-bar" (fab)
int[] foo_array = results.stream()
.mapToInt (fab -> fab.foo_int)
.toArray();
BarClass[] bar_array = results.stream()
.map (fab -> fab.bar_object)
.toArray(BarClass[]::new);
完成了。现在每个阵列都可以去做它的事情了。
除了...在列表上循环两次让我心烦意乱。如果我们需要跟踪更多信息,他们可能会添加第三个字段,然后必须进行第三次传递以将 3 元组转换为三个数组,等等。所以我在开玩笑一次性完成。
分配数据结构很简单,但维护一个供消费者使用的索引似乎很可怕:
int[] foo_array = new int[results.size()];
BarClass[] bar_array = new BarClass[results.size()];
// the trick is providing a stateful iterator across the array:
// - can't just use 'int', it's not effectively final
// - an actual 'final int' would be hilariously wrong
// - "all problems can be solved with a level of indirection"
class Indirection { int iterating = 0; }
final Indirection sigh = new Indirection();
// equivalent possibility is
// final int[] disgusting = new int[]{ 0 };
// and then access disgusting[0] inside the lambda
// wash your hands after typing that code
results.stream().forEach (fab -> {
foo_array[sigh.iterating] = fab.foo_int;
bar_array[sigh.iterating] = fab.bar_object;
sigh.iterating++;
});
这会生成与使用多个流循环的现有解决方案相同的数组。它在大约一半的时间内这样做,去计算。但是迭代器间接技巧看起来非常丑陋,当然排除了并行填充数组的任何可能性。
使用一对以适当容量创建的 ArrayList
实例,将使消费者代码只需为每个实例调用 add
,而无需外部迭代器。但是 ArrayList 的 toArray(T[])
必须再次执行存储数组的副本,并且在 int 的情况下,还有在此之上的装箱/拆箱。
(编辑:“可能重复”问题的答案都谈到只维护流中的索引,并在 filter
/ 期间使用直接数组索引获取实际数据map
调用,并注意如果数据不能通过直接索引访问,它实际上不起作用。虽然这个问题有一个 List
并且只能从“直接索引” “嗯,从技术上讲,List#get
存在”的观点。例如,如果上面的结果集合是一个 LinkedList,则调用 O(n) get
N 次不连续的索引会……不好。)
还有其他更好的可能性是我遗漏的吗?我认为自定义 Collector
可能会做到这一点,但我也不知道如何在那里维护状态,甚至从来没有得到过临时代码。
最佳答案
由于流的大小是已知的,因此没有理由再次重新发明轮子。最简单的解决方案通常是最好的解决方案。您展示的第二种方法几乎就绪 - 只需使用 AtomicInteger
作为数组索引,您将实现您的目标 - 单次传递数据,以及可能的并行流执行(由于 AtomicInteger
).
所以
AtomicInteger index=new AtomicInteger()
results.parallelStream().forEach (fab -> {
int idx=index.getAndIncrement();
foo_array[idx] = fab.foo_int;
bar_array[idx] = fab.bar_object;
});
并行执行的线程安全。对整个集合进行一次迭代
关于Java 8 : Extracting a pair of arrays out of a Stream<Pair>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41926920/
我正在学习使用 STL 的排序函数,方法是将它用于一些复杂的对 vector 。 我有以下 vector : vector > > > > 我需要先根据对中的第一个整数对元素进行排序,如果发现有 2
我想初始化: pair>,vector>> pvp; 所以对于所有的我: pvp.first[i].first = true; 和 pvp.second[i].first = false; 我知道您可
那为什么我们能实例化Pair却不能实例化Pair Pair p=new Pair(); 对比 Pair p=new Pair(); 我知道 意思是未知类型 --> 但不是 意思是一样的---> 有
这个问题在这里已经有了答案: How to have an unordered_map where the value type is the class it's in? (1 个回答) `std
我正在编写一个代码来处理warehouse[item[batch, qty]]的组合,然后将基于[batch, qty]的batch与qty的总和分组。我的代码是: package main impo
我想知道最好的类 java 容器是什么 > 我有一个作为键的 object1 以及一个 t1 和 t2。 我的类具有以下属性: public class Patient implements Exte
所以我有一些使用 Java 8 流的代码,而且它可以工作。它做的正是我需要它做的,而且清晰易读(这在函数式编程中很少见)。在子例程结束时,代码遍历自定义对类型的列表: // All names Hun
我正在声明一个字符串映射到一对对,如下所示: std::map, std::pair>> reference; 我将其初始化为: reference.insert
例如,镜像 pair 至 pair ,我可以像这样创建一个模板函数: template void mirror(const AB& ab,BA& ba){ ba.first=ab.secon
我正在使用 PyZMQ 创建一个简单的 PAIR/PAIR 通信原型(prototype)消息传递模式。 配对服务器 import zmq import random import sys impor
我正在尝试习惯 Kotlin 中的习语和快捷方式,我想知道是否有任何方法可以做到这一点。 val pairList = listOf(Pair(1, 2), Pair(5, 10), Pair(12,
我定义的 map 是这样的 map > hmap; 如果有一个pair(2,pair(3,4))如何得到2 3 4个值,itr->first, itr->第二个不工作 最佳答案 If there is
我希望能够对以下 vector 进行排序 -vector>> 基于 pair 的第一个元素,如果它们相等,则根据它们的第二个元素对它们进行排序,我如何使用 STL 在 C++ 中做到这一点构建? 这种
通过 PHP_PDO: fetchAssoc echo 从 MySql SELECT 查询得到一个 $.getJSON 结果使用 json_encode() 编辑,在 firebug 控制台中的输出如
假设我有以下功能: (defun f (v1 v2) ...) 我想简化以下代码: (lambda (pair) (apply #'f pair)) 此处的目标是创建一个函数,该函数接受两个值的列表并
对不起,我真的不知道怎么写这个标题。我可以想到这样做的代价高昂的方法,但我想看看是否有人可以指出一个优雅的解决方案,这里是: 我有很多成对关联的元素; 每个元素都有一个与其自身关联的数值,该数值表示它
我有一个使用以下方法用 Java 编写的 PreferencesManager: public void insert(Pair keyValue, boolean async) { 我正尝试从 k
这是 assigning-of-unordered-map-to-pair-of-objects 的后续问题.这是一个关于编译器错误解释的问题(而不是一个重复的问题,因为该问题已经得到了完整的回答)。
这是我的 map : map, pair > matchMap; 这是函数: void Schedule::studentSchedule() { string s, c; cout
#include #include #include using namespace std; int main() { map,pair> items; items.inser
我是一名优秀的程序员,十分优秀!