在Java 8中使用FP习惯用法时,异常(尤其是已检查的异常)会严重中断程序逻辑的流程.以下是一个任意示例:
String s1 = "oeu", s2 = "2";
Stream.of(s1, s2).forEach(s ->
System.out.println(Optional.of(s).map(Integer::parseInt).get()));
Run Code Online (Sandbox Code Playgroud)
当不可解析的字符串出现异常时,上面的代码会中断.但是说我只想用默认值替换它,就像我可以用Optional:
Stream.of(s1, s2).forEach(s ->
System.out.println(Optional.of(s)
.map(Integer::parseInt)
.orElse(-1)));
Run Code Online (Sandbox Code Playgroud)
当然,这仍然失败因为Optional只处理nulls.我想要的东西如下:
Stream.of(s1, s2).forEach(s ->
System.out.println(
Exceptional.of(s)
.map(Integer::parseInt)
.handle(NumberFormatException.class, swallow())
.orElse(-1)));
Run Code Online (Sandbox Code Playgroud)
注意:这是一个自我回答的问题.
我正在尝试编写一种方法来打印两个ZonedDateTime之间的时差,关于时区之间的差异.
我找到了一些解决方案,但所有这些解决方案都是用LocalDateTime编写的.
据我所知,dalvik vm中的"java"在API和体系结构等方面与Java se不同.但语法始终是相同的.(如果我错了,请纠正我)
现在java 8中lambda表达式的支持即将发布,android java会跟着吗?google或aosp承诺让dalvik与java se一致吗?
更新:现在和Android 4.4 Kit Kat(API 19)一样,Java 7语法已被正式支持.来自android.com的消息来源
在之前的问题中[ 如何在Java 8中动态进行过滤?] Stuart Marks给出了一个很好的答案,并提供了几个有用的工具来处理从流中选择topN和topPercent.
我会从原来的答案中把它们包括在内:
@FunctionalInterface
public interface Criterion {
Stream<Widget> apply(Stream<Widget> s);
}
Criterion topN(Comparator<Widget> cmp, long n) {
return stream -> stream.sorted(cmp).limit(n);
}
Criterion topPercent(Comparator<Widget> cmp, double pct) {
return stream -> {
List<Widget> temp =
stream.sorted(cmp).collect(toList());
return temp.stream()
.limit((long)(temp.size() * pct));
};
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
[1]如何从包含一定数量项目的流中获取3到7中的热门项目,因此如果流中包含来自A1,A2 ... A10的项目,则调用
topNFromRange(Comparator<Widget> cmp, long from, long to) = topNFromRange(comparing(Widget::length), 3L, 7L)
Run Code Online (Sandbox Code Playgroud)
将返回{A3,A4,A5,A6,A7}
我能想到的最简单的方法是从原版获得前7 [T7],从原版获得前3 [T3],然后获得T7 - T3.
[2]如何从具有一定数量项目的流中获得前10%到前30%的顶级项目,因此如果流中包含来自X1,X2 ... X100的项目,则调用
topPercentFromRange(Comparator<Widget> cmp, double from, double to) = topNFromRange(comparing(Widget::length), 0.10, …Run Code Online (Sandbox Code Playgroud) 我想知道Java 8中最好的方法是使用枚举的所有值.特别是当你需要获取所有值并将其添加到某个地方时,例如,假设我们有以下枚举:
public enum Letter {
A, B, C, D;
}
Run Code Online (Sandbox Code Playgroud)
我当然可以做以下事情:
for (Letter l : Letter.values()) {
foo(l);
}
Run Code Online (Sandbox Code Playgroud)
但是,我还可以在枚举定义中添加以下方法:
public static Stream<Letter> stream() {
return Arrays.stream(Letter.values());
}
Run Code Online (Sandbox Code Playgroud)
然后用以下内容替换上面的for:
Letter.stream().forEach(l -> foo(l));
Run Code Online (Sandbox Code Playgroud)
这种方法是正确的还是在设计或性能方面有问题?而且,为什么enums没有stream()方法?
我有地图Map<Type, Long> countByType,我希望有一个列表,它按相应的值排序(最小到最大)键.我的尝试是:
countByType.entrySet().stream().sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是这只是给我一个条目列表,如何在不丢失订单的情况下获得类型列表?
以UTC格式将LocalDateTime转换为LocalDateTime.
LocalDateTime convertToUtc(LocalDateTime date) {
//do conversion
}
Run Code Online (Sandbox Code Playgroud)
我在网上搜索过.但没有得到解决方案
为了尝试深入理解java流和分裂器,我对spliterator特性有一些微妙的问题:
Q1:Stream.empty()vsStream.of()(没有args的Stream.of())
Stream.empty():SUBSIZED,SIZEDStream.of(): SUBSIZED,IMMUTABLE,SIZED,ORDERED为什么Stream.empty()没有相同的特征Stream.of()?请注意,与Stream.concat()(特别是没有ORDERED)一起使用时会产生影响.我会说不Stream.empty()应该只有IMMUTABLE和ORDERED,还有DISTINCT和NONNULL.也很有意义Stream.of()仅具有一个参数DISTICT.
Q2:LongStream.of()没有NONNULL
刚注意到NONNULL不可用LongStream.of.不是NONNULL所有LongStreams,IntStreams和DoubleStreams 的主要特征吗?
Q3:LongStream.range(,)vsLongStream.range(,).boxed()
LongRange.range(,):SUBSIZED,IMMUTABLE,NONNULL,SIZED,ORDERED,SORTED ,DISTINCTLongStream.range(,).boxed():SUBSIZED,SIZED,ORDERED为什么.boxed()失去所有这些特征?它不应该失去任何.
我明白.mapToObj()可以失去NONNULL,IMMUTABLE和DISTICT,但.boxed()......没有意义.
Q4:.peek()输掉IMMUTABLE和NONNULL
LongStream.of(1): …
请考虑以下代码
public class JDK10Test {
public static void main(String[] args) {
Double d = false ? 1.0 : new HashMap<String, Double>().get("1");
System.out.println(d);
}
}
Run Code Online (Sandbox Code Playgroud)
在JDK8上运行时,此代码会打印,null而在JDK10上会生成此代码NullPointerException
Exception in thread "main" java.lang.NullPointerException
at JDK10Test.main(JDK10Test.java:5)
Run Code Online (Sandbox Code Playgroud)
除了JDK10编译器生成的两个与自动装箱相关的附加指令外,编译器生成的字节码几乎完全相同,并且似乎负责NPE.
15: invokevirtual #7 // Method java/lang/Double.doubleValue:()D
18: invokestatic #8 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
Run Code Online (Sandbox Code Playgroud)
这种行为是JDK10中的错误还是故意更改以使行为更严格?
JDK8: java version "1.8.0_172"
JDK10: java version "10.0.1" 2018-04-17
Run Code Online (Sandbox Code Playgroud) 在DateTimeFormatter类文档定义了不同的符号u为一年,y一年的时代:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns
年份和年份有什么区别?