是java.util.stream.Collectors::joining实现线程安全的?我能做点什么吗
public final class SomeClass {
private static final Collector<CharSequence, ?, String> jc = Collectors.joining(",");
public String someMethod(List<String> someList) {
return someList.parallelStream().collect(jc);
}
}
Run Code Online (Sandbox Code Playgroud)
不用担心遇到并发问题?
我想创建一个方法来创建一个元素流,这些元素是多个给定流的笛卡尔积(由二元运算符在末尾聚合到相同类型).请注意,参数和结果都是流,而不是集合.
例如,对于{A,B}和{X,Y}的两个流,我希望它生成值{AX,AY,BX,BY}的流(简单串联用于聚合字符串).到目前为止,我已经提出了这个代码:
private static <T> Stream<T> cartesian(BinaryOperator<T> aggregator, Stream<T>... streams) {
Stream<T> result = null;
for (Stream<T> stream : streams) {
if (result == null) {
result = stream;
} else {
result = result.flatMap(m -> stream.map(n -> aggregator.apply(m, n)));
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这是我想要的用例:
Stream<String> result = cartesian(
(a, b) -> a + b,
Stream.of("A", "B"),
Stream.of("X", "Y")
);
System.out.println(result.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
预期结果:AX, AY, BX, BY.
另一个例子:
Stream<String> result = …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种有效的方法来如何轻松地将其转换BitSet为二进制字符串.让我们说它的通常长度将是数千位.
例如,让我们:
BitSet bits = new BitSet(8);
bits.set(1);
bits.set(3);
Run Code Online (Sandbox Code Playgroud)
这是理想的结果:
String result = toBinaryString(bits);
// expected: result = "01010000"
Run Code Online (Sandbox Code Playgroud)
我总体上有一些想法(溪流等),但可能有一些明显的标准方法,我只是缺少.
我在玩ScheduledExecutorService.我想要做的是启动一个简单的自动收报机(每秒一个滴答)并安排另一个任务(5秒后)取消第一个任务.然后阻止主线程直到所有内容完成,这应该在两个任务完成后(+ - 5秒).
这是我的代码:
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
Runnable tickTask = () -> System.out.println("Tick");
ScheduledFuture<?> scheduledTickTask = executor.scheduleAtFixedRate(tickTask, 0, 1, TimeUnit.SECONDS);
Runnable cancelTask = () -> scheduledTickTask.cancel(true);
executor.schedule(cancelTask, 5, TimeUnit.SECONDS);
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
Run Code Online (Sandbox Code Playgroud)
让我感到惊讶的问题是,BLOCKS好像还有一些正在运行的任务.为什么?该cancelTask应立即结束,并且scheduledTickTask只是取消了,所以这是什么问题?
java multithreading scheduled-tasks java-8 scheduledexecutorservice
例如:我有一个带有电子邮件的用户对象列表。我想收集具有不同电子邮件的用户列表(因为使用同一电子邮件的两个用户可能是同一个人,因此我不在乎这些差异)。换句话说,对于每个不同的键(电子邮件),我想获取通过该键找到的第一个值(用户),而忽略其余的值。
这是我想出的代码:
public List<User> getUsersToInvite(List<User> users) {
return users
.stream()
// group users by their e-mail
// the resulting map structure: email -> [user]
.collect(Collectors.groupingBy(User::getEmail, LinkedHashMap::new, Collectors.toList()))
// browse each map entry
.entrySet()
.stream()
// get the first user object for each entry
.map(entry -> entry.getValue().get(0))
// collect such first entries into a list
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
还有一些更优雅的方法吗?
java ×5
java-8 ×4
java-stream ×3
binary ×1
bits ×1
bitset ×1
concurrency ×1
email ×1
set ×1
string ×1