Tag: java 8

如何强制max()返回Java Stream中的所有最大值?

我已经testing了Java 8 lambdaexpression式和stream的max()函数,并且似乎在max()被执行的情况下,即使多于一个对象比较为0,它也会返回绑定候选中的任意元素进一步考虑。 是否有一个明显的技巧或function,这样一个最大期望的行为,以便所有的最大值返回? 我没有看到API中的任何内容,但我相信它必须比手动比较更好。 例如: //myComparator is an IntegerComparator Stream.of(1,3,5,3,2,3,5).max(myComparator).forEach(System.out::println); //Would print 5,5 in any order.

Java 8 Lambdaexpression式 – 嵌套类中的多个方法

我正在阅读有关新function: http : //www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html 我看到下面的例子: 使用匿名类: button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { System.out.println("Action Detected"); } }); 随着Lambda: button.addActionListener(e -> { System.out.println("Action Detected"); }); 如果他们想要在匿名类中实现多个方法,有人会用MouseListener做什么,例如: public void mousePressed(MouseEvent e) { saySomething("Mouse pressed; # of clicks: " + e.getClickCount(), e); } public void mouseReleased(MouseEvent e) { saySomething("Mouse released; # of clicks: " + e.getClickCount(), e); […]

Collectors.toMap中的Java 8 NullPointerException

如果其中一个值为“null”,则Java 8 Collectors.toMap将引发NullPointerException 。 我不明白这个行为,地图可以包含空指针作为值没有任何问题。 Collectors.toMap值不能为null是否有充分的理由? 此外,是否有一个很好的Java 8的方式来解决这个问题,或者我应该恢复到普通的旧的循环? 我的问题的一个例子: 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 setId(int id) { this.id = […]

通过谓词查找第一个元素

我刚刚开始使用Java 8 lambdaexpression式,并试图在函数式语言中实现一些我习惯的东西。 例如,大多数函数式语言都具有某种查找函数,它可以对序列进行操作,或者列表返回第一个元素,谓词为true 。 我可以看到在Java 8中实现这一点的唯一方法是: lst.stream() .filter(x -> x > 5) .findFirst() 然而,这对我来说似乎是无效的,因为filter将扫描整个列表,至less在我的理解(这可能是错误的)。 有没有更好的办法?

Java 8:Lambdastream,按exception进行过滤

我尝试使用Java 8的Lambdaexpression式时遇到问题。通常情况下,它可以正常工作,但是现在我有了抛出IOException的方法。 最好看看下面的代码: class Bank{ …. public Set<String> getActiveAccountNumbers() throws IOException { Stream<Account> s = accounts.values().stream(); s = s.filter(a -> a.isActive()); Stream<String> ss = s.map(a -> a.getNumber()); return ss.collect(Collectors.toSet()); } …. } interface Account{ …. boolean isActive() throws IOException; String getNumber() throws IOException; …. } 问题是,它不能编译,因为我必须捕捉isActive-和getNumber-Methods的可能exception。 但即使我明确地使用下面的try-catch-Block,它仍然不能编译,因为我没有捕捉到exception。 所以无论是在JDK中有一个错误,或者我不知道如何捕获这些exception。 class Bank{ …. //Doesn't compile either public […]

如何将一个迭代器转换为一个stream?

我正在寻找一种简洁的方式来将Iterator转换为Stream或者更具体地说,将迭代器“查看”为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(); 根据评论中的一些build议,我也尝试使用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 Source) at java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1351) […]

在Stream :: flatMap中使用Java 8的Optional

新的Java 8stream框架和朋友提供了一些非常简洁的java代码,但是我遇到了一个看似简单的情况,这很难做到简洁。 考虑一个List<Thing> things和方法Optional<Other> resolve(Thing thing) 。 我想把这些Thing映射到Optional<Other> s并获得第一个Other 。 明显的解决scheme是使用things.stream().flatMap(this::resolve).findFirst() ,但flatMap需要你返回一个stream,而Optional没有stream()方法(或者它是Collection或提供方法将其转换为或Collection为一个Collection )。 我能想到的最好的是这样的: things.stream() .map(this::resolve) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); 但是,这似乎是一个非常普遍的情况,似乎非常啰嗦。 任何人有更好的主意?

分区Java 8stream

如何在Java 8 Stream上实现“分区”操作? 通过分区我的意思是,将一个stream划分成给定大小的子stream。 不知何故,它将与Guava Iterators.partition()方法相同,只是希望分区是懒惰评估的Streams而不是List。

收集到stream到一个新的集合

我正在寻找最无痛的方式来过滤一个集合。 我在想这样的事情 Collection<?> foo = existingCollection.stream().filter( … ). … 但我不确定从filter到返回或填充另一个集合的最佳方式。 大多数例子似乎是“在这里你可以打印”。 可能有一个构造函数,或输出方法,我错过了。

如何将Java 8stream转换为数组?

将Java 8 Stream转换为数组最简单/最简单的方法是什么?