Questions tagged «java-8»

对于2014年3月18日发行的Java平台的第8版(内部版本1.8)特定于Java 8的问题,请使用此标记。在大多数情况下,您还应该指定java标记。

7
如何将迭代器转换为流?
我正在寻找一种Iterator将a 转换为Stream或更具体地以将“迭代器”作为流“查看”的简洁方法。 出于性能原因,我想避免在新列表中复制迭代器: Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator(); Collection<String> copyList = new ArrayList<String>(); sourceIterator.forEachRemaining(copyList::add); Stream<String> targetStream = copyList.stream(); 根据评论中的一些建议,我也尝试使用Stream.generate: public static void main(String[] args) throws Exception { Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator(); Stream<String> targetStream = Stream.generate(sourceIterator::next); targetStream.forEach(System.out::println); } 但是,我得到了NoSuchElementException(因为没有调用hasNext) Exception in thread "main" java.util.NoSuchElementException at java.util.AbstractList$Itr.next(AbstractList.java:364) at Main$$Lambda$1/1175962212.get(Unknown …
468 java  iterator  java-8 

8
Java 8 Iterable.forEach()与foreach循环
Java 堆栈:Java 8:чтолучше? 以下哪个是Java 8中的最佳实践? Java 8: joins.forEach(join -> mIrc.join(mSession, join)); Java 7: for (String join : joins) { mIrc.join(mSession, join); } 我有很多可以用lambda简化的for循环,但是使用它们真的有任何优势吗?会提高其性能和可读性吗? 编辑 我还将这个问题扩展到更长的方法。我知道您无法从lambda返回或中断父函数,在比较它们时也应考虑到这一点,但是还有其他需要考虑的地方吗?

26
Java 8按属性区分
在Java 8中,如何Stream通过检查每个对象的属性的不同性来使用API 过滤集合? 例如,我有一个Person对象列表,我想删除同名的人, persons.stream().distinct(); 将对对象使用默认的相等性检查Person,所以我需要类似的东西, persons.stream().distinct(p -> p.getName()); 不幸的是,该distinct()方法没有这样的重载。如果不修改Person类内部的相等性检查,是否可以简洁地做到这一点?

14
从Java 8中的java.util.stream.Stream检索列表
我在玩Java 8 lambda来轻松过滤集合。但是我没有找到一种简洁的方法来在同一条语句中以新列表的形式检索结果。到目前为止,这是我迄今为止最简洁的方法: List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L); List<Long> targetLongList = new ArrayList<>(); sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add); 网上的示例没有回答我的问题,因为它们停止了而没有生成新的结果列表。必须有一种更简洁的方法。我本来期望的是,Stream类有方法为toList(),toSet(),... 有没有办法targetLongList可以由第三行直接分配变量?


14
Java 8并行流中的自定义线程池
是否可以为Java 8 并行流指定自定义线程池?我在任何地方都找不到。 假设我有一个服务器应用程序,并且想使用并行流。但是该应用程序很大且是多线程的,因此我想将其划分。我不希望一个模块中的某个模块中的任务运行缓慢,而另一个模块中的任务却运行缓慢。 如果不能为不同的模块使用不同的线程池,则意味着在大多数实际情况下,我不能安全地使用并行流。 请尝试以下示例。在单独的线程中执行一些CPU密集型任务。任务利用并行流。第一个任务已中断,因此每个步骤需要1秒钟(由线程睡眠模拟)。问题是其他线程被卡住并等待中断的任务完成。这是一个人为的示例,但是假设有一个servlet应用程序,有人向共享的fork联接池提交了一个长时间运行的任务。 public class ParallelTest { public static void main(String[] args) throws InterruptedException { ExecutorService es = Executors.newCachedThreadPool(); es.execute(() -> runTask(1000)); //incorrect task es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.execute(() -> runTask(0)); es.shutdown(); es.awaitTermination(60, TimeUnit.SECONDS); } private static void runTask(int …

18
为什么在参数中不使用Java 8的Optional
我已经在许多网站上阅读了Optional应该仅用作返回类型,而不能在方法参数中使用。我正在努力找到一个合理的理由。例如,我有一段逻辑,其中包含2个可选参数。因此,我认为这样写我的方法签名是有意义的(解决方案1): public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 { // my logic } 许多指定为Optional的网页不应用作方法参数。考虑到这一点,我可以使用以下方法签名并添加清晰的Javadoc注释以指定参数可以为null,希望以后的维护者将读取Javadoc,因此始终在使用参数之前进行null检查(解决方案2) : public int calculateSomething(String p1, BigDecimal p2) { // my logic } 另外,我可以用四个公共方法替换我的方法,以提供更好的接口,并使p1和p2更明显(解决方案3): public int calculateSomething() { calculateSomething(null, null); } public int calculateSomething(String p1) { calculateSomething(p1, null); } public int calculateSomething(BigDecimal p2) { calculateSomething(null, p2); } public …
392 java  java-8  optional 

22
在Java 8中,有没有一种简洁的方法可以迭代带有索引的流?
是否有一种简洁的方法可以在访问流中的索引的同时对流进行迭代? String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"}; List<String> nameList; Stream<Integer> indices = intRange(1, names.length).boxed(); nameList = zip(indices, stream(names), SimpleEntry::new) .filter(e -> e.getValue().length() <= e.getKey()) .map(Entry::getValue) .collect(toList()); 与那里给出的LINQ示例相比,这似乎令人失望 string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" }; var nameList = names.Where((c, index) => c.Length <= index + 1).ToList(); 有没有更简洁的方法? …
382 java  java-8  java-stream 



14
如何定义Java 8中将lambda作为参数的方法?
在Java 8中,可以将方法创建为Lambda表达式,并可以通过引用将其传递(在后台进行一些工作)。在线上有很多示例,其中创建了lambda并将其与方法一起使用,但没有如何使用lambda作为参数的方法的示例。它的语法是什么? MyClass.method((a, b) -> a+b); class MyClass{ //How do I define this method? static int method(Lambda l){ return l(5, 10); } }
363 java  lambda  java-8 

13
最终和有效最终之间的区别
我在用Java 8玩lambda,遇到警告local variables referenced from a lambda expression must be final or effectively final。我知道,当我在匿名类中使用变量时,它们必须在外部类中为final,但仍然-final和有效的final之间有什么区别?


5
为什么Java 8接口方法中不允许“最终”?
Java 8最有用的功能之一是default接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因): 提供实际的默认实现。例:Iterator.remove() 允许JDK API演进。例:Iterable.forEach() 从API设计人员的角度来看,我希望能够在接口方法上使用其他修饰符,例如final。在添加便捷方法时,这将很有用,以防止在实现类时“意外”覆盖: interface Sender { // Convenience method to send an empty message default final void send() { send(null); } // Implementations should only implement this method void send(String message); } 如果Sender已经上过课,以上是已经很普遍的做法: abstract class Sender { // Convenience method to send an empty message final void …

12
Collectors.toMap中的Java 8 NullPointerException
如果其中一个值为“ null”,则Java 8 Collectors.toMap会抛出a NullPointerException。我不了解这种行为,地图可以包含空指针作为值,而没有任何问题。是否有充分的理由为什么值不能为null Collectors.toMap? 另外,是否有解决此问题的不错的Java 8方法,还是我应该还原为普通的for循环? 我的问题的一个例子: import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; class Answer { private int id; private Boolean answer; Answer() { } Answer(int id, Boolean answer) { this.id = id; this.answer = answer; } public int getId() { return id; } public void …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.