Tag: java stream

使用Java 8 Stream API查找枚举值

假设有一个名为Type的简单枚举,如下所示: enum Type{ X(“S1”), Y(“S2”); private String s; private Type(String s) { this.s = s; } } 使用for-loop的静态方法(假设该方法在enum中定义)可以轻松地找到给定s的正确枚举,例如: private static Type find(String val) { for (Type e : Type.values()) { if (esequals(val)) return e; } throw new IllegalStateException(String.format(“Unsupported type %s.”, val)); } 我认为用Stream API表示的function等价物将是这样的: private static Type find(String val) { return Arrays.stream(Type.values()) .filter(e -> esequals(val)) […]

Java 8 Stream IllegalStateException:Stream已经被操作或关闭

我正在尝试使用Stream API生成Order实例。 我有一个创建订单的工厂函数,DoubleStream用于初始化订单金额。 private DoubleStream doubleStream = new Random().doubles(50.0, 200.0); private Order createOrder() { return new Order(doubleStream.findFirst().getAsDouble()); } @Test public void test() { Stream orderStream = Stream.generate(() -> { return createOrder(); }); orderStream.limit(10).forEach(System.out::println); 如果我使用文字(1.0)初始化Order实例,这可以正常工作。 当我使用doubleStream创建随机数量时,抛出exception。 知道如何解决这个问题吗? TIA, 奥勒

为什么并行流不使用ForkJoinPool的所有线程?

所以我知道如果你在没有自定义ForkJoinPool的情况下使用parallelStream ,它将使用默认的ForkJoinPool,默认情况下,只有少一个线程,因为你有处理器。 因此,如此处所述 (以及该问题的另一个答案)为了获得更多的并行性,您必须: 将并行流执行提交给您自己的ForkJoinPool:yourFJP.submit(() – > stream.parallel()。forEach(doSomething)); 所以,我这样做了: import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.stream.IntStream; import com.google.common.collect.Sets; public class Main { public static void main(String[] args) throws InterruptedException, ExecutionException { ForkJoinPool forkJoinPool = new ForkJoinPool(1000); IntStream stream = IntStream.range(0, 999999); final Set thNames = Collections.synchronizedSet(new HashSet()); forkJoinPool.submit(() -> { stream.parallel().forEach(n -> { System.out.println(“Processing […]

使用带参数的方法引用

我刚开始学习Java流并遇到了问题。 请看下面的例子。 这是Node类的一部分: private Map nodes; public Optional child(String name) { return Optional.ofNullable(nodes.get(name)); } private void findChildren(String name, List result) { child(name).ifPresent(result::add); nodes.values().stream() // .map(Node::findChildren(name, result)) // .forEach(Node::findChildren(name, result)) .forEach(node -> node.findChildren(name, result)); } 我的目的是使用流中每个节点上的名称和结果参数调用#findChildren。 我试图使用方法引用Node :: findChildren没有运气。 我很欣赏其他与->运算符的解决方案。 是否可以将方法引用与参数一起使用? 我喜欢流的想法,我只想让代码更具可读性。 实际上,我认为有一个类似的问题方法引用与我读过的参数 ,但无法弄清楚如何在我的代码中使用bind2方法。 这是唯一的解决方案吗?

Java 8 Stream,获得头尾

Java 8引入了一个类似于Scala的Stream的Stream类,这是一个function强大的惰性结构,使用它可以非常简洁地执行这样的操作: def from(n: Int): Stream[Int] = n #:: from(n+1) def sieve(s: Stream[Int]): Stream[Int] = { s.head #:: sieve(s.tail filter (_ % s.head != 0)) } val primes = sieve(from(2)) primes takeWhile(_ < 1000) print // prints all primes less than 1000 我想知道是否有可能在Java 8中这样做,所以我写了这样的东西: IntStream from(int n) { return IntStream.iterate(n, m -> m + 1); […]

迭代两个Java-8-Streams

我想将两个Java-8-Streams一起迭代,以便我在每次迭代中都有两个参数。 像这样的东西,其中somefunction产生类似Stream<Pair> 。 Stream as; Stream bs; somefunction (as, bs) .forEach ((a, b) -> foo (a, b)); // or something like somefunction (as, bs) .forEach ((Pair abs) -> foo (abs.left (), abs.right ())); 我想知道,如果Java提供类似的东西,虽然Java中没有Pair :-(如果没有像这样的API函数,是否有另一种方式同时迭代两个流?

如何创建正则表达式匹配流?

我试图解析标准输入并提取与特定模式匹配的每个字符串,计算每个匹配的出现次数,并按字母顺序打印结果。 这个问题似乎是Streams API的一个很好的匹配,但是我找不到从Matcher创建匹配流的简洁方法。 我通过在匹配项上实现迭代器并将其包装到Stream中解决了这个问题,但结果不是很易读。 如何在不引入其他类的情况下创建正则表达式匹配流? public class PatternCounter { static private class MatcherIterator implements Iterator { private final Matcher matcher; public MatcherIterator(Matcher matcher) { this.matcher = matcher; } public boolean hasNext() { return matcher.find(); } public String next() { return matcher.group(0); } } static public void main(String[] args) throws Throwable { Pattern pattern = Pattern.compile(“[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)”); […]

为什么并行流在Java 8中按顺序收集

为什么forEach以随机顺序打印数字,而collect总是以原始顺序收集元素,即使是从并行流中收集? Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8}; List listOfIntegers = new ArrayList(Arrays.asList(intArray)); System.out.println(“Parallel Stream: “); listOfIntegers .stream() .parallel() .forEach(e -> System.out.print(e + ” “)); System.out.println(); // Collectors List l = listOfIntegers .stream() .parallel() .collect(Collectors.toList()); System.out.println(l); 输出: Parallel Stream: 8 1 6 2 7 4 5 3 [1, 2, 3, 4, […]

如何从float 获取流

当我注意到一些奇怪的东西时,我正在学习如何使用java 8流。 Arrays.stream()有浮点数组的所有方法: Arrays.stream(int[]) : IntStream Arrays.stream(long[]) : LongStream Arrays.stream(double[]) : DoubleStream 类似地,有int,double等的Stream实现,但不是浮点数: IntStream LongStream DoubleStream 这有什么理由吗? 使用浮点流的推荐方法是什么?

收集器的组合器function是否可以用于顺序流?

示例程序: public final class CollectorTest { private CollectorTest() { } private static BinaryOperator nope() { return (t, u) -> { throw new UnsupportedOperationException(“nope”); }; } public static void main(final String… args) { final Collector<Integer, ?, List> c = Collector.of(ArrayList::new, List::add, nope()); IntStream.range(0, 10_000_000).boxed().collect(c); } } 因此,为了简化这里的问题,没有最终的转换,因此生成的代码非常简单。 现在, IntStream.range()生成一个顺序流。 我只是将结果Integer成Integer ,然后我设计的Collector将它们收集到List 。 很简单。 无论我运行多少次这个示例程序, UnsupportedOperationException不会命中,这意味着永远不会调用我的虚拟组合器。 我有点期待这个,但后来我已经误解了流,我不得不问这个问题…… […]