Tag: java 8

不指定类型参数,不能将Java 8方法与lambda参数一起使用

我使用类型参数创建了一个方法,使用这些类型参数返回generics类型,并使用Function参数,这也取决于类型参数。 当我使用lambdas作为参数时,编译器强制我指定方法的类型参数,这感觉不对。 我正在设计一个实用程序类,其中包含与Stream.flatMap一起使用的方法。 它将每种集合条目映射到包含键和值元素的FlatEntry,并且可以使用构建器在多个级别上执行此操作。 受影响的方法是flatEntryMapperBuilder 。 这是代码: import java.util.function.Function; import java.util.stream.Stream; public class GdkStreams { public static Function<T, Stream<FlatEntry>> flatEntryMapper(Function keyMapper, Function<T, Stream> valueMapper) { return input -> { K key = keyMapper.apply(input); return valueMapper.apply(input).map(value -> new FlatEntry(key, value)); }; } public static FlatEntryMapperBuilder flatEntryMapperBuilder(Function keyMapper, Function<T, Stream> valueMapper) { return new FlatEntryMapperBuilder(keyMapper, valueMapper); } […]

如何从Iterator 中创建无限的Stream ?

看看下面我上面写的课: public class FibonacciSupplier implements Iterator { private final IntPredicate hasNextPredicate; private int beforePrevious = 0; private int previous = 1; private FibonacciSupplier(final IntPredicate hasNextPredicate) { this.hasNextPredicate = hasNextPredicate; } @Override public boolean hasNext() { return hasNextPredicate.test(previous); } @Override public Integer next() { int result = beforePrevious + previous; beforePrevious = previous; previous = result; […]

并行flatMap总是顺序的

假设我有这个代码: Collections.singletonList(10) .parallelStream() // .stream() – nothing changes .flatMap(x -> Stream.iterate(0, i -> i + 1) .limit(x) .parallel() .peek(m -> { System.out.println(Thread.currentThread().getName()); })) .collect(Collectors.toSet()); 输出是相同的线程名称,因此这里parallel没有任何好处 – 我的意思是,有一个线程可以完成所有工作。 在flatMap里面有这样的代码: result.sequential().forEach(downstream); 我理解强制sequential属性如果“外部”流是并行的(它们可能会阻塞),“外部”将不得不等待“flatMap”完成,反过来(因为使用相同的公共池)但是为什么总是强迫呢? 这是那些可能在以后的版本中发生变化的事情之一吗?

是否有一种方便的方法来创建一个测试字段是否等于给定值的谓词?

我经常发现自己需要过滤Stream或使用谓词来检查给定字段是否具有给定值。 比方说,我有这个POJO: public class A { private Integer field; public A(final Integer field) { this.field = field; } public Integer getField() { return field; } } 我想根据field的值过滤对象Stream : final Integer someValue = 42; Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null)) .filter(a -> Objects.equals(a.getField(), someValue)) … 是否有一种方便的方法来生成filter方法的谓词? 我注意到有Predicate.isEqual但它不符合需要。 我可以很容易地写一个这样的: public static Predicate isEqual(Function […]

在Java8中引用具有不同参数的方法

我想知道所有这些方法引用和function接口如何在较低级别上工作。 最简单的例子是我们有一些List List list = new ArrayList(); list.add(“b”); list.add(“a”); list.add(“c”): 现在我们想用Collections类对它进行排序,所以我们可以调用: Collections.sort(list, String::compareToIgnoreCase); 但是,如果我们定义自定义比较器,它可能是这样的: Comparator customComp = new MyCustomOrderComparator(); Collections.sort(list, customComp::compare); 问题是Collections.sort有两个参数:List和Comparator。 由于Comparator是function接口,因此可以使用具有相同签名(参数和返回类型)的lambda表达式或方法引用替换它。 那么它如何工作我们可以传递也引用compareTo只接受一个参数并且这些方法的签名不匹配? 如何在Java8中翻译方法引用?

是否可以在Scala中使用Java 8样式方法引用?

我正在Scala中开发JavaFX8应用程序,但我无法弄清楚如何将方法引用传递给事件处理程序。 为了澄清,我没有使用ScalaFX库,而是直接在JavaFX上构建我的应用程序。 这是相关的代码段。 InputController.java (我用Java编写了这个测试类来隔离问题,只使用方法引用) public class InputController { public void handleFileSelection(ActionEvent actionEvent){ //event handling code } public InputController() { //init controller } } 这工作(Java) InputController inputController = new InputController(); fileButton.setOnAction(inputController::handleFileSelection); 这不起作用(Scala) val inputController = new InputController fileButton.setOnAction(inputController::handleFileSelection) 这是编译器的错误消息(Scala 2.11.6)。 Error:(125, 45) missing arguments for method handleFileSelection in class Main; follow this method with ‘_’ […]

Stream上的收集操作是否关闭流和底层资源?

以下代码是否需要包含在try-with-resources中以确保底层文件已关闭? List rows = Files.lines(inputFilePath).collect(Collectors.toList());

JDK8u40的src.zip在哪里?

我安装了JDK8u40,但只找到了javafx-src.zip。 我在哪里可以找到JDK的源代码? src.zip? 以下是安装后的内容: 顺便说一句,我没有看到安装向导! 这很奇怪。 添加1 今天我尝试了几个Java安装包。 所有都是从Oracle官方网站下载的。 JDK-6u45-Windows的i586.exe JDK-7u75-Windows的i586.exe JDK-8u20-Windows的i586.exe JDK-8u25-Windows的i586.exe JDK-8u31-Windows的i586.exe JDK-8u40-Windows的i586.exe 6u45和7u75安装在我的盒子上。 我可以看到安装向导。 并安装了src.zip 。 但是8u25 ~ 8u40都安静地安装了。 并且没有安装src.zip文件,因为我没有机会在向导中选择它。 我不确定这是我的错,还是甲骨文的某个人犯了错误。 正如@SubOptimal所评论的那样, /s选项表示静默安装。 我想知道是否有强制GUI安装向导打开的选项。 我使用的是Windows 7 Enterprise x64 Build 7601 SP1

解析和翻译Java 8 lambda表达式

在C#中,您可以将lambda表达式包含在表达式树对象中,然后可能会对其进行解析 。 我想知道这是否也可以用Java? 我正在寻找的是做这样的事情: BooksRepository.getAll() .where(b -> b.getIban() == “SomeIban”) .and(b -> b.getAuthor() == “SomeAuthor”); //etc. 然后BooksRepository应该以某种方式将该查询转换为基于指定为lambdas的谓词的以下RESTful API请求: GET http://mylibrary.com/books?Iban=SomeIban&Author=SomeAuthor 然后将结果返回给客户端。 如果在Java中甚至可以实现这一点?

无法解析String到LocalDate(Java 8)

我的输入是2015年7月1日格式为“01-07-2015”的日期的字符串表示。我正在尝试将其解析为java.time.LocalDate变量: final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern(“dd-MM-YYYY”); final String input = “01-07-2015”; final LocalDate localDate = LocalDate.parse(input, DATE_FORMAT); 基于DateTimeFormatter JavaDoc ,我希望这可行。 但是,我收到了一条非常友好和乐于助人的消息: 引起:java.time.DateTimeException:无法从TemporalAccessor获取LocalDate:{DayOfMonth = 1,MonthOfYear = 7,WeekBasedYear [WeekFields [MONDAY,4]] = 2015},ISO类型为java.time.format.Parsed 我真的不明白这个例外告诉我的是什么。 任何人都可以解释我出了什么问题吗?