我有一个Parent具有20个属性的Java类(attrib1, attrib2 .. attrib20)及其相应的getter和setter.我还有两个Parent对象列表:list1和list2.
现在我想合并两个列表并避免基于attrib1和的重复对象attrib2.
使用Java 8:
List<Parent> result = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是我必须在哪个地方指定属性?我应该覆盖hashCode和equals方法吗?
有没有人理解为什么以下代码在Java 7及更低版本中可以正常编译,但是在Java 8中失败了.
public static void main(String[] args) throws Exception {
put(get("hello"));
}
public static <R> R get(String d) {
return (R)d;
}
public static void put(Object o) {
System.err.println("Object " + o);
}
public static void put(CharSequence c) {
System.err.println("CharSequence " + c);
}
public static void put(char[] c) {
System.err.println("char[] " + c);
}
Run Code Online (Sandbox Code Playgroud)
get方法具有泛型返回类型.在JDK 7及更低版本中,这将编译精细,并选择带有Object参数的put方法.在JDK 8中,这无法编译,表明put方法不明确.
显然JDK 8正在跳过Object-parameter方法并找到最后两个子Object-parameter方法并抱怨它们(即如果你添加另一个put方法和其他一些参数类型,编译器将切换并抱怨新的last两种方法)
这似乎是一个错误.
有没有办法创建IntStream一系列的整数?
就像我想要将值1到1000流,我可以调用一些IntStream静态工厂来传输该范围?
IntStream.forRange(1, 1000).forEach(//do something...
Run Code Online (Sandbox Code Playgroud) 出于教育目的,我想使用Java-8创建素数流.这是我的方法.x如果没有不超过的主要除数,则该数字为素数sqrt(x).所以假设我已经有一个素数流我可以使用以下谓词来检查:
x -> Seq.seq(primes()).limitWhile(p -> p <= Math.sqrt(x)).allMatch(p -> x % p != 0)
Run Code Online (Sandbox Code Playgroud)
在这里,我使用jOOλ库(0.9.10,如果重要的话)仅用于limitWhile标准Stream API中不存在的操作.所以现在知道一些先前的素数prev我可以生成下一个素数迭代数字,直到找到与该谓词匹配的那个:
prev -> LongStream.iterate(prev + 1, i -> i + 1)
.filter(x -> Seq.seq(primes()).limitWhile(p -> p <= Math.sqrt(x))
.allMatch(p -> x % p != 0))
.findFirst()
.getAsLong()
Run Code Online (Sandbox Code Playgroud)
把所有东西放在一起我写了以下primes()方法:
public static LongStream primes() {
return LongStream.iterate(2L,
prev -> LongStream.iterate(prev + 1, i -> i + 1)
.filter(x -> Seq.seq(primes())
.limitWhile(p -> p <= Math.sqrt(x)) …Run Code Online (Sandbox Code Playgroud) 最后,本文介绍了新的Java 8 Optional,并指出
可选项并不像Scala中的Option [T]那么强大(但至少它不允许包装null).API不像null处理那么简单,可能要慢得多.但编译时检查的好处加上可选性的可读性和文档值始终大大优于劣势
我对Scala有一个非常基本的了解,并且我熟悉Java 8 Optional,所以初看起来,我不清楚两者之间有什么区别,如果有的话.
我知道,例如,在Scala中我可以使用模式匹配来测试Option并让我的生活更轻松.但是,排除Scala语法的特性,我想知道Option在Scala中是否可以用OptionalJava 做些什么.
希望这不是一个愚蠢的问题,但每当我读到"强大的"时,问号就会浮现在我的头上.
我有一系列双值,我想总结并获得最大值.这DoubleStream.summaryStatistics()听起来很完美.该getSum()方法有一个API注释提醒我在我的一个计算机科学课程中学到了什么:如果值按其绝对值排序,求和问题的稳定性往往会更好.但是,DoubleStream不允许我指定要使用的比较器,Double.compareTo如果我调用sorted()流,它将只使用.
因此,我将价值观收集到一个final Stream.Builder<Double> values = Stream.builder();电话中
values.build()
.sorted(Comparator.comparingDouble(Math::abs))
.mapToDouble(a -> a).summaryStatistics();
Run Code Online (Sandbox Code Playgroud)
然而,这看起来有点冗长,我宁愿使用DoubleStream.Builder而不是通用的构建器.我是否错过了某些内容或者我是否真的必须使用盒装版本的流才能指定比较器?
简而言之,我有这个代码,我想使用条件和lambda获取数组的特定元素.代码将是这样的:
Preset[] presets = presetDALC.getList();
Preset preset = Arrays.stream(presets).select(x -> x.getName().equals("MyString"));
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用.在C#中会有类似的东西,但在Java中,我该怎么做?
Lambda转换是一个两步过程,一个是:将lambda放入同一个类中的静态方法中.
public class Main {
public static void main(String[] args) {
Runnable r = () -> System.out.println("Hello");
System.out.println(Arrays.asList(Main.class.getDeclaredMethods()));
}
}
Run Code Online (Sandbox Code Playgroud)
[ private static void Main.lambda $ main $ 0(),public static void Main.main(java.lang.String [])]
二:生成实现功能接口的类.
System.out.println("A class has been generated: " + r.getClass());
System.out.println("That implements a Functional Interface: " + Arrays.asList(r.getClass().getInterfaces()));
Run Code Online (Sandbox Code Playgroud)
已生成一个类:类Main $$ Lambda $ 1/149928006
这实现了一个功能接口:[interface java.lang.Runnable]
问题:这种静态方法需要什么?为什么不能将lambda主体直接放入接口方法?就像是:
class Main$$Lambda$1 {
public void run() {
/* Lambda body here */
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个方法,每次执行它时都会生成一个对象,我需要颠倒我获取它们的顺序.所以我认为这样做的自然方式就是Stack,因为它是LIFO.
但是,Java Stack似乎不能很好地与新的Java 8流API一起使用.
如果我这样做:
Stack<String> stack = new Stack<String>();
stack.push("A");
stack.push("B");
stack.push("C");
List<String> list = stack.stream().collect(Collectors.toList());
System.out.println("Collected: " + list);
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
Collected: [A, B, C]
Run Code Online (Sandbox Code Playgroud)
为什么不以预期的LIFO顺序将它们输出到流中?这是将所有项目从堆栈清除到右(LIFO)顺序列表的正确方法吗?
我想删除someMap不存在密钥的所有项目someList.看看我的代码:
someMap.keySet().stream().filter(v -> !someList.contains(v)).forEach(someMap::remove);
Run Code Online (Sandbox Code Playgroud)
我收到了java.util.ConcurrentModificationException.为什么?流不是平行的.这样做最优雅的方法是什么?