Tag: java 8

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, 奥勒

何时大括号在Java 8 lambda语法中是可选的?

我意识到Java 8 lambda实现可能会发生变化,但在lambda build b39中,我发现只有当lambda表达式返回非void类型时才能省略大括号。 例如,这编译: public class Collections8 { public static void main(String[] args) { Iterable names = Arrays.asList(“Alice”, “Bob”, “Charlie”); names.filter(e -> e.length() > 4).forEach(e -> { System.out.println(e); }); } } 但删除这样的大括号: names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e)); 给出错误 Collections8.java:6: error: method forEach in interface Iterable cannot be applied to given types; […]

DateTimeFormatter月模式字母“L”失败

我注意到java.time.format.DateTimeFormatter无法按预期解析。 见下文: import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class Play { public static void tryParse(String d,String f) { try { LocalDate.parse(d, DateTimeFormatter.ofPattern(f)); System.out.println(“Pass”); } catch (Exception x) {System.out.println(“Fail”);} } public static void main(String[] args) { tryParse(“26-may-2015″,”dd-L-yyyy”); tryParse(“26-May-2015″,”dd-L-yyyy”); tryParse(“26-may-2015″,”dd-LLL-yyyy”); tryParse(“26-May-2015″,”dd-LLL-yyyy”); tryParse(“26-may-2015″,”dd-M-yyyy”); tryParse(“26-May-2015″,”dd-M-yyyy”); tryParse(“26-may-2015″,”dd-MMM-yyyy”); tryParse(“26-May-2015″,”dd-MMM-yyyy”); } } 只有tryParse(“26-May-2015″,”dd-MMM-yyyy”);的最后一次尝试tryParse(“26-May-2015″,”dd-MMM-yyyy”); 将传递”。 根据文档, LLL应该能够解析文本格式。 也不是大写’M’与小写’m’的细微差别。 这真的很烦人,因为我无法默认解析Oracle DB默认格式化的字符串 SELECT TO_DATE(SYSDATE,’DD-MON-YYYY’) AS dt […]

Java 8链式方法参考?

假设有一个典型的Java Bean: class MyBean { void setA(String id) { } void setB(String id) { } List getList() { } } 我想在BiConsumer的帮助下创建一种更抽象的方式来调用setter: Map<SomeEnum, BiConsumer> map = … map.put(SomeEnum.A, MyBean::setA); map.put(SomeEnum.B, MyBean::setB); map.put(SomeEnum.List, (myBean, id) -> myBean.getList().add(id)); 有没有办法用链式方法引用替换lambda (myBean, id) -> myBean.getList().add(id) ,类似于(myBean.getList())::add或myBean::getList::add还是其他什么?

为什么并行流不使用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 […]

在Java8函数样式中,如何将值映射到现有的键值对

我有一张地图: Map<String, List> dataMap; 现在我想向地图添加新的键值对,如下所示: if(dataMap.contains(key)) { List list = dataMap.get(key); list.add(someNewObject); dataMap.put(key, list); } else { List list = new ArrayList(); list.add(someNewObject) dataMap.put(key, list); } 我如何使用Java8function样式?

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, […]