public class MyDateTimeFormatterTest {
private static final String BASE_PATTERN = "yyyy/MM/dd HH:mm:ss";
private static final DateTimeFormatter FORMATTER =
DateTimeFormatter.ofPattern(BASE_PATTERN + "[.SSSSSSSSS]");
private static final LocalDateTime TEST_INPUT =
LocalDateTime.of(2015, 5, 4, 12, 34, 56, 123456789);
@DataProvider(name = "test-cases")
public Iterator<Object[]> getTestCases() {
return Arrays.asList(testFor("", ChronoUnit.SECONDS),
testFor(".SSS", ChronoUnit.MILLIS),
testFor(".SSSSSS", ChronoUnit.MICROS),
testFor(".SSSSSSSSS", ChronoUnit.NANOS)).iterator();
}
@Test(dataProvider = "test-cases")
public void testWithDefaultResolution(String input, LocalDateTime output) {
assertThat(FORMATTER.parse(input, LocalDateTime::from), equalTo(output));
}
private Object[] testFor(String patternSuffix, TemporalUnit truncatedTo) {
return new Object[] …Run Code Online (Sandbox Code Playgroud) 这是MCVE:
public static void main(String[] args) {
CompletableFuture<String> r1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "41";
});
CompletableFuture<String> r2 = CompletableFuture.supplyAsync(() -> "42");
CompletableFuture<String> r3 = CompletableFuture.supplyAsync(() -> {
System.out.println("I'm called.");
return "43";
});
CompletableFuture.allOf(r1, r2, r3).thenRun(() -> { System.out.println("End."); });
Stream.of(r1, r2, r3).forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)
有点好奇,没有实际完成CompletableFuture从allOf(...),例如调用它join(),我得到以下输出:
I'm called.
java.util.concurrent.CompletableFuture@<...>[Not completed, 1 dependents]
java.util.concurrent.CompletableFuture@<...>[Completed normally]
java.util.concurrent.CompletableFuture@<...>[Completed normally]
Run Code Online (Sandbox Code Playgroud)
我可以知道是什么导致JVM处理/认为r1有1(估计数量)依赖CompletableFuture …
我有一些Map对象K使用不同类型的值键入相同类型的对象,V1...VN为了这个问题的目的,不共享超类型*:
Map<K, V1> kv1
Map<K, V2> kv2
Map<K, V3> kv3
...
Map<K, VN> kvN
Run Code Online (Sandbox Code Playgroud)
我需要创建一个结果类型的地图Map<K, V>,通过不同地过滤每个地图,然后使用"值映射器"将值映射到这些地图上V1...VN常见类型的V新值(即a Function<? super Entry<K, VN>, ? extends V>).因此,我有以下static帮助方法来执行前两个步骤:
public static <K, VN, V> Map<K, V> filterAndMapValue(final Map<K, VN> map,
final Predicate<? super Entry<K, VN>> predicate,
final Function<? super Entry<K, VN>, ? extends V> mapper) {
return map.entrySet().stream().filter(predicate)
.collect(Collectors.toMap(Entry::getKey, mapper));
}
Run Code Online (Sandbox Code Playgroud)
我当前的用例使得可以安全地假设只有在每个映射上的过滤后才会给出最终Map对象的不同键(每个映射中可以使用相同的键),但是如果在未来,我知道我可以提供一个补充mergeFunction表达来Collectors.toMap(Function, …