Tag: java 8

如何从Java8 lambda 创建Runnable

我遇到了一些代码,尽管有点阅读,但我还是很难理解。 调用一个方法,该方法接收两个args,其中一个是Runnable。 而不是传入一个Runnable对象虽然有一个lambda。 例如: 公共类LambdaTest {private final Lock lock = new ReentrantLock(); @Test public void createRunnableFromLambda(){Locker.runLocked(lock,() – > {System.out.println(“hello world”);}); public static class Locker {public static void runLocked(Lock lock,Runnable block){lock.lock(); 尝试{block.run(); } finally {lock.unlock(); }}}} 所以我的问题是,你能解释一下如何从lambda创建Runnable,还有人可以解释语法() – > {}。 具体来说,()括号是什么意思? 谢谢。

是否可以在Java 8中扩展枚举?

只是玩,并想出一个甜蜜的方式来添加Java Enum toString()方法中的 enumfunction。 一些进一步的修补让我几乎也添加了一个整洁(即没有抛出exception)反向查找,但有一个问题。 据报道: error: valueOf(String) in X cannot implement valueOf(String) in HasValue public enum X implements PoliteEnum, ReverseLookup { overriding method is static 有办法吗? 这里的目的是静默添加(通过接口实现,使用default方法,如我在链接的答案中添加了politeName )一个lookup方法,该方法执行valueOf函数而不抛出exception。 可能吗? 显然现在可以扩展enum – 直到现在我的Java主要问题之一。 这是我失败的尝试: public interface HasName { public String name(); } public interface PoliteEnum extends HasName { default String politeName() { return name().replace(“_”, ” […]

Java 8嵌套循环,包含流和性能

为了练习Java 8流,我尝试将以下嵌套循环转换为Java 8流API。 它计算a ^ b(a,b <100)的最大数字总和,并在我的Core i5 760上占用~0.135s。 public static int digitSum(BigInteger x) { int sum = 0; for(char c: x.toString().toCharArray()) {sum+=Integer.valueOf(c+””);} return sum; } @Test public void solve() { int max = 0; for(int i=1;i<100;i++) for(int j=1;j<100;j++) max = Math.max(max,digitSum(BigInteger.valueOf(i).pow(j))); System.out.println(max); } 我的解决方案,我希望由于并行性而更快,实际上需要0.25秒(没有parallel() 0.19s): int max = IntStream.range(1,100).parallel() .map(i -> IntStream.range(1, 100) .map(j->digitSum(BigInteger.valueOf(i).pow(j))) […]

Java 8 findFirst并遇到订单

findFirst的JavaDocs表示如果流具有遭遇顺序,则将始终返回第一个元素,但如果流没有遇到顺序,则可能返回任何元素。 我试图演示它如何在没有遭遇顺序的流上工作,但我不能让它返回除了实际的第一个元素之外的任何东西。 我尝试将元素添加到Set ,它没有定义的遭遇顺序: Set words = new HashSet(); words.addAll(Arrays.asList(“this”, “is”, “a”, “stream”, “of”, “strings”)); Optional firstString = words.stream() .findFirst(); System.out.println(firstString); 每次我跑,我得到a作为第一个字符串。 然后我尝试在List上执行Collections.shuffle ,然后将其添加到Set ,但这并没有改变任何东西。 List wordList = Arrays.asList(“this”, “is”, “a”, “stream”, “of”, “strings”); words = new HashSet(); words.addAll(wordList); firstString = words.stream() .findFirst(); System.out.println(firstString); 我每次都会回复这个词。 然后我尝试使用BaseStream的unordered方法,该方法声称返回没有遇到顺序的流,但没有区别: firstString = Stream.of(“this”, “is”, “a”, “stream”, “of”, “strings”) .unordered() […]

Concat VS Merge运算符

我正在检查RXJava的文档,我注意到concat和merge运算符似乎也是这样。 我写了几个测试以确定。 @Test public void testContact() { Observable.concat(Observable.just(“Hello”), Observable.just(“reactive”), Observable.just(“world”)) .subscribe(System.out::println); } @Test public void testMerge() { Observable.merge(Observable.just(“Hello”), Observable.just(“reactive”), Observable.just(“world”)) .subscribe(System.out::println); } 文件说 Merge运算符也类似。 它结合了两个或多个Observable的发射,但可以交错它们,而Concat从不交错来自多个Observable的发射。 但是我还是不完全明白,运行这个测试千次,合并结果总是一样的。 由于订单未被授予,我期待有时“react native”“世界”“你好”。 代码在这里https://github.com/politrons/reactive

Java 8将给定的时间和时区转换为UTC时间

我有时间用字符串类型: “2015-01-05 17:00″和ZoneId是”Australia/Sydney” 。 如何使用Java 8 datetime API将此时间信息转换为对应的UTC时间? 还需要考虑DST的东西。

为什么添加“.map(a – > a)”允许这个编译?

这与我对“流减少不兼容类型”的回答有关。 我不知道为什么我的建议有效,而霍尔格正确地向我施压。 但即使他似乎也没有清楚解释它为何起作用。 那么,让我们问它自己的问题: 以下代码无法在javac中javac (对于下面的ideone链接,这是sun-jdk-1.8.0_51 ,根据http://ideone.com/faq ): public Object with(Stream<Predicate> predicates) { return predicates.reduce(Predicate::or); } 这是正确的:或者从这个流中合并两个谓词就像写: Predicate a = null; Predicate b = null; a.or(b); // Compiler error! 但是,它确实在intellij中编译,尽管在Predicate::or方法引用上有原始类型警告。 显然,它也会在eclipse中编译(根据原始问题)。 但是这段代码确实: public Object with(Stream<Predicate> predicates) { return predicates.map(a -> a).reduce(Predicate::or); // ^———-^ Added } Ideone演示 尽管我想要尝试这个,但我不清楚为什么这会起作用。 我的手工波形解释是.map(a -> a)就像一个“强制转换”,并且给类型推断算法提供了更多的灵活性来选择允许应用reduce的类型。 但我不确定那种类型到底是什么。 请注意,这不等于使用.map(Function.identity()) ,因为它被约束为返回输入类型。 ideone演示 任何人都可以解释为什么这可以参考语言规范,或者如Holger建议的那样,它是一个编译器错误? […]

Java 8 Streams peek api

我试着看下面的Java 8代码片段。 List list = Arrays.asList(“Bender”, “Fry”, “Leela”); list.stream().peek(System.out::println); 但是控制台上没有打印出任何内容。 如果我这样做: list.stream().peek(System.out::println).forEach(System.out::println); 我看到以下内容同时输出了peek和foreach调用。 Bender Bender Fry Fry Leela Leela foreach和peek接受了(Consumer action)那么为什么输出会有所不同?

在嵌套的Java 8并行流动作中使用信号量可能是DEADLOCK。 这是一个错误吗?

考虑以下情况:我们使用Java 8并行流来执行并行forEach循环,例如, IntStream.range(0,20).parallel().forEach(i -> { /* work done here */}) 并行线程的数量由系统属性“java.util.concurrent.ForkJoinPool.common.parallelism”控制,通常等于处理器的数量。 现在假设我们想限制特定工作的并行执行次数 – 例如,因为该部分是内存密集型的,而内存约束意味着并行执行的限制。 限制并行执行的一种明显而优雅的方法是使用信号量( 此处建议),例如,以下代码片段将并行执行的数量限制为5: final Semaphore concurrentExecutions = new Semaphore(5); IntStream.range(0,20).parallel().forEach(i -> { concurrentExecutions.acquireUninterruptibly(); try { /* WORK DONE HERE */ } finally { concurrentExecutions.release(); } }); 这很好用! 但是:在worker中使用任何其他并行流(在/* WORK DONE HERE */ )可能会导致死锁 。 对我来说,这是一个意外的行为。 说明:由于Java流使用ForkJoin池,因此内部forEach正在分叉,并且连接似乎正在等待。 但是,这种行为仍然出乎意料。 请注意,如果将”java.util.concurrent.ForkJoinPool.common.parallelism”设置为1,并行流甚至可以工作。 另请注意,如果存在内部并行forEach,则它可能不透明。 问题: 这种行为是否符合Java 8规范(在这种情况下,它意味着禁止在并行流工作者中使用信号量)或者这是一个错误? […]

如何在Java 8中实现构建器模式?

我常常发现使用pre-java-8设置实现构建器模式很繁琐。 总是有很多几乎重复的代码。 构建器本身可以被视为样板。 事实上,有代码重复检测器 ,几乎可以考虑使用pre-java-8工具制作的构建器的每个方法作为每个其他方法的副本。 所以考虑下面的类和它的pre-java-8构建器: public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class PersonBuilder { private static […]