我们知道Java 8引入了一个新的Stream API, java.util.stream.Collector是定义如何聚合/收集数据stream的接口。 但是,收集器接口是这样devise的: public interface Collector<T, A, R> { Supplier<A> supplier(); BiConsumer<A, T> accumulator(); BinaryOperator<A> combiner(); Function<A, R> finisher(); } 为什么它不是像下面这样devise的? public interface Collector<T, A, R> { A supply(); void accumulate(A accumulator, T value); A combine(A left, A right); R finish(A accumulator); } 后者更容易实现。 devise它作为前者的考虑是什么?
为什么 ZonedDateTime now = ZonedDateTime.now(); System.out.println(now.withZoneSameInstant(ZoneOffset.UTC) .equals(now.withZoneSameInstant(ZoneId.of("UTC")))); 打印出false ? 我期望两个zonedDateTimes是平等的。
采取以下行示例代码: Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet()); 我想要一个HashSet 。 把一个debugging器的代码,我确实得到一个HashSet 。 我看了一下java.util.stream.Collectors.toSet()来观察下面的代码: public static <T> Collector<T, ?, Set<T>> toSet() { return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add, (left, right) -> { left.addAll(right); return left; }, CH_UNORDERED_ID); } 合约保证一个Set ,实现决定一个HashSet ; 看起来合理。 但是,我的实现需要由HashSet保证的恒定时间查找,而不仅仅是任何旧的Set 。 如果toSet()的实现决定使用FooSet ,这完全在它的权限之内,那么我的实现就会受到影响。 这个问题的最佳实践解决scheme是什么?
为什么这会抛出一个java.lang.NullPointerException ? List<String> strings = new ArrayList<>(); strings.add(null); strings.add("test"); String firstString = strings.stream() .findFirst() // Exception thrown here .orElse("StringWhenListIsEmpty"); //.orElse(null); // Changing the `orElse()` to avoid ambiguity strings的第一项是null ,这是一个完全可以接受的值。 此外, findFirst()返回一个Optional ,这对于findFirst()能够处理null来说更为findFirst() 。 编辑:更新orElse()更不明确。
有时我想在一个stream上执行一组操作,然后用其他操作以两种不同的方式处理结果stream。 我能做到这一点,而不必指定两次通用的初始操作? 例如,我希望有一个如下所示的dup()方法: Stream [] desired_streams = IntStream.range(1, 100).filter(n -> n % 2 == 0).dup(); Stream stream14 = desired_streams[0].filter(n -> n % 7 == 0); // multiples of 14 Stream stream10 = desired_streams[1].filter(n -> n % 5 == 0); // multiples of 10
我有映射Map<Type, Long> countByType ,我想有一个列表已按sorting(最小到最大)的键相应的值。 我的尝试是: countByType.entrySet().stream().sorted().collect(Collectors.toList()); 然而,这只是给了我一个条目列表,我怎样才能得到一个types的列表,而不会失去顺序?
现在随着杰克 Google的发布澄清了Java在Android方面的可预见的未来。 但是对Scala和其他基于JVM的语言开发人员有什么影响。 尤其是: 由于自己的编译器生成Java字节码,Scala确实很神奇。 但杰克工具链不处理字节码 。 将生成的字节码获得杰克处理的优化好处吗? 从Scala 12开始,只支持Java 8+。 这就是生成的字节码也是Java 8+。 杰克能否使用Java 8字节码(没有或有限制)? 可以新支持的Java 8function用于开发较旧的Android版本(minSdkVersion <'N'),或者我应该为每个Java版本维护单独的分支? (从文档中不清楚)。 所有这些问题归结为一个:Scala可以用于未来的Android开发,而不牺牲新的Scalafunction和新的Android工具链的好处? 相关阅读: Java 8语言特性 杰克(Java的Android编译器套件) 新的Android工具链 – 杰克和吉尔 杰克和吉尔构build系统(幻灯片) Hello World,满足我们新的实验工具链 斯卡拉2.12路线图 请在评论或答案中分享相关链接 相关问题: Android N Java 8function(Jack编译器)和Kotlin互操作 有关: 在Android上的小组讨论 请为杰克工具function请求投票: Jill支持Java 8字节码(库) 支持Java 8语言function 编辑: 我试图推理(不回答)我的问题,希望专家会纠正我,如果我错了。 下面是Jack的一个假设stream程,其中增加了一些基于我的逻辑和我从可用文档中学到的额外的块。 基本的假设是,Dalvik最多支持Java 7字节码指令。 如果这是正确的Java 8指令不能直接传递给Dalvik,它们应该以某种方式转换为Java 7.(可能类似于Scala编译器总是这样)。 比问题是转换发生在哪里? 似乎Jill现在不能处理Java 8字节码,所以可能发生在假设stream程的块(3)中。 […]
我试图使用jackson写一个类的值为JSON,可选的字段: public class Test { Optional<String> field = Optional.of("hello, world!"); public Optional<String> getField() { return field; } public static void main(String[] args) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.writeValueAsString(new Test())); } } 执行时,这个类将生成以下输出: {"field":{"present":true}} 我明白当前/不存在的领域被包括在内,并且可以在阅读JSON数据时解决它,但是我无法解决这个事实,即可选的实际内容从不写入输出。 🙁 任何解决方法在这里,除了根本不使用ObjectMapper?
什么是Java 8的默认垃圾收集器? 当我检查JMX Beans时,他们发现它是新一代的平行收集器,老一代的老系列收集器。
Java 8引入了lambda函数,我想实现像factorial: IntToDoubleFunction fact = x -> x == 0 ? 1 : x * fact.applyAsDouble(x-1); 编译返回 error: variable fact might not have been initialized 我怎样才能引用函数本身。 类是匿名的,但实例存在:它被称为fact 。