- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
因为我经常使用流,其中一些流处理大量数据,所以我认为预先分配一个近似大小的基于集合的收集器是个好主意,以防止昂贵的重新分配作为集合成长。所以我想出了这个,以及其他集合类型的类似方法:
public static <T> Collector<T, ?, Set<T>> toSetSized(int initialCapacity) {
return Collectors.toCollection(()-> new HashSet<>(initialCapacity));
}
像这样使用
Set<Foo> fooSet = myFooStream.collect(toSetSized(100000));
我担心的是 Collectors.toSet()
的实现设置了 Characteristics
枚举,而 Collectors.toCollection()
没有:Characteristics.UNORDERED
。 Collectors.toCollection()
没有方便的变体来设置超出默认值的所需特征,我无法复制 Collectors.toSet()
的实现,因为可见性问题。因此,要设置 UNORDERED
特性,我不得不这样做:
static<T> Collector<T,?,Set<T>> toSetSized(int initialCapacity){
return Collector.of(
() -> new HashSet<>(initialCapacity),
Set::add,
(c1, c2) -> {
c1.addAll(c2);
return c1;
},
new Collector.Characteristics[]{IDENTITY_FINISH, UNORDERED});
}
所以这是我的问题: 1. 这是我为像自定义 toSet()
这样简单的东西创建无序收集器的唯一选择吗 2. 如果我想让它理想地工作,是否有必要应用无序特性?我读过 a question on this forum我了解到无序特征不再反向传播到 Stream 中。它仍然有用吗?
最佳答案
首先,UNORDERED
Collector
的特征有没有帮助性能,没有别的。 Collector
没有问题不具有该特征但不取决于遇到的顺序。
此特性是否有影响取决于流操作本身和实现细节。虽然当前的实现可能不会从中汲取太多优势,但由于反向传播的困难,这并不意味着 future 的版本不会。当然,已经无序的流不受 UNORDERED
的影响。 Collector
的特征.并非所有流操作都有可能从中受益。
所以更重要的问题是不阻止这种潜在的优化(也许在将来)有多重要。
请注意,还有其他未指定的实现细节,会影响您的第二个变体的潜在优化。 toCollection(Supplier)
收集器具有未指定的内部工作原理,仅保证提供由 Supplier
生成的类型的最终结果。 .相比之下,Collector.of(() -> new HashSet<>(initialCapacity), Set::add, (c1, c2) -> { c1.addAll(c2); return c1; }, IDENTITY_FINISH, UNORDERED)
精确定义收集器应该如何工作,并且还可能阻碍收集器的内部优化产生 future 版本的收集器。
这是一种在不触及 Collector
的其他方面的情况下指定特征的方法将是最好的解决方案,但据我所知,现有的 API 没有提供简单的方法。但是自己建立这样的设施很容易:
public static <T,A,R> Collector<T,A,R> characteristics(
Collector<T,A,R> c, Collector.Characteristics... ch) {
Set<Collector.Characteristics> o = c.characteristics();
if(!o.isEmpty()) {
o=EnumSet.copyOf(o);
Collections.addAll(o, ch);
ch=o.toArray(ch);
}
return Collector.of(c.supplier(), c.accumulator(), c.combiner(), c.finisher(), ch);
}
用那个方法,很容易说,例如
HashSet<String> set=stream
.collect(characteristics(toCollection(()->new HashSet<>(capacity)), UNORDERED));
或者提供你的工厂方法
public static <T> Collector<T, ?, Set<T>> toSetSized(int initialCapacity) {
return characteristics(toCollection(()-> new HashSet<>(initialCapacity)), UNORDERED);
}
这限制了提供您的特征所需的努力(如果这是一个反复出现的问题),因此提供它们不会有什么坏处,即使您不知道它会产生多大的影响。
关于java - 尽可能在 Collectors 中使用 Characteristics.UNORDERED 重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37063512/
我想知道是否有比我通常采用的方法更直接的方法来计算某种类型的变量...... 下面的例子可能最好地解释了它。我有一个包含 2 列的数据框(水果以及水果是否腐烂)。我想为每一行添加例如同类别水果腐烂的百
在 peripheral didDiscoverServices() 和 peripheral didDiscoverCharacteristicsForService() 中,我正在尝试以下操作:
我正在使用以下代码为使用 IOS 核心蓝牙的蓝牙特性(重置设备)写入 0xDE 值: ... NSData *bytes = [@"0xDE" dataUsingEncoding:NSUTF8Stri
尝试使用以下函数从特征中检索可读信息: peripheral.discoverDescriptors(for: characteristic) 稍后的委托(delegate)方法: func peri
我尝试使用 Swift 3 在 Xcode 中创建一个小型 iOS 应用程序。我尝试连接到 BLE 设备,然后读取电池电量。 我收到这样的回复: ...UUID = Battery Level, pr
我正在尝试读取来自 BT 设备的读数并将其转换为字符串。 , notifying = YES> 基于我在网上找到的例子我做了 let u16 = (characteristic.value! as N
关于 http://en.cppreference.com/w/cpp/numeric/random : The Mersenne twister is slower and has greater
我有一个 Android (Glass) 应用程序,它充当 BLE 中央并连接到一个BLE 外围设备(这是一个使用 Core Bluetooth 的 iOS 设备)。我正在尝试从 和 写入外围设备。
我正在使用 BLE 开发一个安卓应用程序。此应用程序的要求是更新具有各种输入的特定硬件中的电压变化。所以我在这个应用程序中启用了 BLE 通知 API。这将在一段时间内通知应用程序最新的硬件电压。 实
我正在将一个计步器连接到 android。当我在 setCharacteristicNotification 函数中执行以下行时,我得到的描述符为 Null BluetoothGattDescript
已关注 sample 我知道: 如何阅读特征值。 但我不知道: 如何将数据写入固件。 我试了几次,还是不行。 这是编码: if ((charaProp | BluetoothGattCharacter
在我的应用程序中,我发现我的外围设备具有给定的服务。然后,在继续之前,我会检查是否存在所有需要的特征。 当我为我的特征写入一个值时,回调 didWriteValueForCharacteristic:
我正在尝试从我的移动设备(扫描仪)写入已连接的可穿戴设备(广播设备)中的描述符。 在可穿戴设备上,我将描述符定义为 readCharacteristic = new BluetoothGattChar
我已经编写了一些 CoreBluetooth 代码,我可以发现设备,但我似乎无法发现我发现的外围设备的特征。谁有好的示例代码可供我用来验证我的代码? 这是我写的: #import "ViewContr
如何找出低功耗蓝牙 (BLE) 中的 MTU 与最大特征尺寸之间的关系? 我有一个运行“回声”程序的 BLE 开发板 - 所以无论它收到什么,它都会立即回复。 在我的 Android 设备上,如果我请
我有一组 n 个实数。我也有一套功能, f_1, f_2, ..., f_m. 这些函数中的每一个都将数字列表作为其参数。我还有一组 m 个范围, [l_1, u_1], [l_2, u_2], ..
因为我经常使用流,其中一些流处理大量数据,所以我认为预先分配一个近似大小的基于集合的收集器是个好主意,以防止昂贵的重新分配作为集合成长。所以我想出了这个,以及其他集合类型的类似方法: public s
我正在编写一个 Android BLE 应用程序,我正在尝试获取某个特性的权限。我已经设法使用 characteristic.getProperties() 获取特征属性,它返回一个非零值,但是,当我
我正在使用 [peripheral writeValue:startFrame forCharacteristic:cbWriteCharacteristic type:CBCharacteristi
我搜索了一下,发现这是一个可能重复的问题: Multiple CBPeripheral's for same device 我的问题是: 我有多项服务,它们加起来大约有30-40 个特征(是的,我需要
我是一名优秀的程序员,十分优秀!