Tag: java 8

我需要使用Java 8 Optional方法获取包装值,或者调用void返回Consumer lambda

我不熟悉在Java 8中使用选项。我知道方法orElseGet()需要一个供应商,orElseThrow()也需要一个抛出exception的供应商。 orElseThrow()可能是一个很好用的,如果我可以构造自己的exception并在触发该exception时执行某些操作。 我的主要目标是使用一个方法来获取未包装的值,或者如果可选的包装为null,则实际执行一个完全不同的函数。 寻找最接近的东西: class DoInsteadClass { public void doInstead() { // Do this instead } } Optional myString = “Hello”; num.orElse(DoInsteadClass::doInstead); 如果执行此操作的唯一方法是orElseThrow(),并且只要我可以使用’do this instead’代码处理exception,那也应该没问题。 它只是使我的代码库更大,因为我必须为2或3个案例创建一些不同的自定义实用程序供应商,其中一些可选值将返回null。 问题是,.ifPresent()用值调用指定的使用者,否则什么也不做。 如果值为null,我需要它来进行SOMETHING。 我当前的代码使用自定义的解决方法,我首先检查值是否为null,如果是,则执行所选的函数。 然后下一个语句是检查ifPresent()的语句。 所以这是做同样的事情,我只是在寻找更多糖衣,一个声明版本。

API中的奇怪语法“String :: concat”

我正在研究使用1.8对Java SE API所做的一些更改,我在查看新方法Map.merge时,它显示了如何将其与行一起使用的示例 map.merge(key, msg, String::concat) 我理解如何使用lambda表达式来创建匿名function接口,但这似乎使用一个方法作为BiFunction。 我喜欢理解和使用晦涩的java语法,但我无法在任何地方找到任何提及。

Lombok与Java 8有关

我刚刚升级到Intellij构思14和Java 8,我也想到将我的项目升级到Java版本8,开始使用一些新function。 但是在正确配置Intellij以使用Java 8后,我仍然遇到了Lombok的问题。 看起来Java 8和@Getter之间存在冲突,因为现在我的@Getter和@Setter注释不再起作用了。 lombok的版本是1.10.8。 有什么建议么?

使用新的dateTime API获取持续时间

我想得到一个代表3年持续时间的java.time.Duration实例, 我找到了两种方法(见下面的代码)。 public static void main(String[] args) { Duration d1 = Duration.of(3, ChronoUnit.YEARS); //Runtime Exception Duration d2 = ChronoUnit.YEARS.getDuration().multipliedBy(3); System.out.println(“d2=”+d2.toDays()); //OUTPUT: d2=1095 } 第一种方法d1在运行时抛出以下exception: 线程“main”中的exceptionjava.time.temporal.UnsupportedTemporalTypeException:Unit不能有估计的持续时间 在java.time.Duration.plus(未知来源) 在java.time.Duration.of(未知来源) 在mod7.vehicalc.Test.main(Test.java:26) 第二种方式, d2 ,按预期工作。 造成这种差异的原因是什么?

来自模板化对象的Java 8函数构造函数

我正在使用Eclipse Luna Service Release 2(4.4.2),Java 8 u51。 我正在尝试创建一个方法,该方法将基于另一个方法参数创建传递对象的实例。 原型简化为 public T test(Object param, T instance) { Constructor constructor = instance.getClass().getConstructors()[0]; // I actually choose a proper constructor // eclipse reports “Unhandled exception type InvocationTargetException” Function createFun = constructor::newInstance; T result = (T) createFun.apply(param); return result; } 与Function声明一致的eclipse报告Unhandled exception type InvocationTargetException编译器错误。 我需要Function以后在流中使用。 我试图添加各种try / catch块,抛出声明,但没有修复此编译器错误。 如何使这段代码工作?

在JSR-310中计算修改过的朱利安日

如何从JSR-310类(如LocalDate计算Modified Julian日? (在JDK 8中) 具体来说,这是计算称为“修改过的朱利安日”的连续天数 ,而不是朱利安日历系统中的日期 。 例如: LocalDate date = LocalDate.now(); long modifiedJulianDay = ???

Java流 – 通过嵌套列表分组(按第二顺序列出)

我有以下数据结构 – 每个学生的名单,每个学生都拥有一个国家名单,每个国家都有一份城市名单。 public class Student { private int id; private String name; private List states = new ArrayList(); } public class State { private int id; private String name; private List Cities = new ArrayList(); } public class City { private int id; private String name; } 我想得到以下内容。 Map citiesIdsToStudensList; 我写了以下内容 Map<Integer, List> statesToStudentsMap […]

Arrays.stream()。map()。sum()的不稳定性能

我偶然发现了一个非常不稳定的性能曲线实例,它对原始数组进行了非常简单的map / reduce操作。 这是我的jmh基准代码: @OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) @OperationsPerInvocation(Measure.ARRAY_SIZE) @Warmup(iterations = 300, time = 200, timeUnit=MILLISECONDS) @Measurement(iterations = 1, time = 1000, timeUnit=MILLISECONDS) @State(Scope.Thread) @Threads(1) @Fork(1) public class Measure { static final int ARRAY_SIZE = 1<(int)(Math.random()*(1< multiplier*d; } @Benchmark public double multiply() { return Arrays.stream(ds).map(mapper).sum(); } } 以下是典型输出的片段: # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/bin/java # VM options: # Warmup: […]

使用Collections.frequency()打印某些值

我有一个数组如下: int[] array = {11, 14, 17, 11, 48, 33, 29, 11, 17, 22, 11, 48, 18}; 我想要做的是找到重复的值,并打印出来。 所以我这样做的方法是转换为ArrayList ,然后Set并使用Set上的stream 。 ArrayList list = new ArrayList(array.length); for (int i = 0; i < array.length; i++) { list.add(array[i]); } Set dup = new HashSet(list); 然后我使用stream循环遍历它并使用Collections.frequency打印值。 dup.stream().forEach((key) -> { System.out.println(key + “: ” + Collections.frequency(list, key)); }); […]

Java 8复杂的自定义收集器

我有一个对象流,我想以下面的方式收集。 假设我们正在处理论坛post: class Post { private Date time; private Data data } 我想创建一个按期间对post进行分组的列表。 如果X分钟没有post,请创建新组。 class PostsGroup{ List posts = new ArrayList (); } 我想获得一个List其中包含按时间间隔分组的post。 例如:间隔10分钟。 post: [{time:x, data:{}}, {time:x + 3, data:{}} , {time:x+ 12, data:{}, {time:x + 45, data:{}}}] 我想获得一个post组列表: [ {posts : [{time:x, data:{}}, {time:x + 3, data:{}}, {time:x+ 12, data:{}]]}, {posts : […]