我经常遇到Java lambda表达式的问题,当我想在对象的任意属性或方法上使用distinct()一个流时,但想要保留对象而不是将其映射到该属性或方法.我开始创建这里讨论的容器,但我开始做足够的事情,它变得烦人,并制作了很多样板类.
我将这个Pairing类放在一起,该类包含两个类型的两个对象,并允许您指定左,右或两个对象的键控.我的问题是......对于某些类型的关键供应商,distinct()是否真的没有内置的lambda流功能?那真让我感到惊讶.如果没有,该课程能否可靠地完成该功能?
以下是它的调用方式
BigDecimal totalShare = orders.stream().map(c -> Pairing.keyLeft(c.getCompany().getId(), c.getShare())).distinct().map(Pairing::getRightItem).reduce(BigDecimal.ZERO, (x,y) -> x.add(y));
Run Code Online (Sandbox Code Playgroud)
这是配对课程
public final class Pairing<X,Y> {
private final X item1;
private final Y item2;
private final KeySetup keySetup;
private static enum KeySetup {LEFT,RIGHT,BOTH};
private Pairing(X item1, Y item2, KeySetup keySetup) {
this.item1 = item1;
this.item2 = item2;
this.keySetup = keySetup;
}
public X getLeftItem() {
return item1;
}
public Y getRightItem() {
return item2;
}
public static <X,Y> Pairing<X,Y> keyLeft(X item1, Y item2) { …Run Code Online (Sandbox Code Playgroud) 我下载了JDK8 build b121,在尝试安装时遇到以下错误:
the procedure entry point RegDeleteKeyExA could not be located in the dynamic link library ADVAPI32.dll
操作系统是Windows XP,版本2002 Service Pack 3,32位.
我有一个double[],我想在一行中过滤掉(创建一个没有新的数组)负值而不添加for循环.这是否可以使用Java 8 lambda表达式?
在python中,这将使用生成器:
[i for i in x if i > 0]
Run Code Online (Sandbox Code Playgroud)
是否有可能在Java 8中做同样简洁的事情?
我正在使用Java 8进行项目,发现了一种我无法理解的情况.
我有这样的代码:
void deleteEntity(Node node) throws SomeException {
for (ChildNode child: node.getChildren()) {
deleteChild(child);
}
}
void deleteChild(Object child) throws SomeException {
//some code
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,但我可以用方法引用重写它:
void deleteEntity(Node node) throws SomeException {
node.getChildren().forEach(this::deleteChild);
}
Run Code Online (Sandbox Code Playgroud)
并且此代码无法编译,从而产生错误Incompatible thrown types *SomeException* in method reference.
IDEA也给了我错误unhandled exception.
所以,我的问题是为什么?为什么代码为每个循环编译而不用lambda编译?
寻找一种链接选项的方法,以便返回第一个存在的选项.如果没有,Optional.empty()则应退回.
假设我有几个像这样的方法:
Optional<String> find1()
Run Code Online (Sandbox Code Playgroud)
我想把它们链起来:
Optional<String> result = find1().orElse( this::find2 ).orElse( this::find3 );
Run Code Online (Sandbox Code Playgroud)
但当然这不起作用,因为orElse期望一个值,并orElseGet期望一个Supplier.
我试图基于某些属性从对象列表中删除重复项.
我们可以使用java 8以简单的方式完成它
List<Employee> employee
Run Code Online (Sandbox Code Playgroud)
我们可以根据id员工的财产从中删除重复项.我已经看到帖子从字符串的arraylist中删除重复的字符串.
在JDK8中,当我使用parallelStream时会产生多少个线程?例如,在代码中:
list.parallelStream().forEach(/** Do Something */);
Run Code Online (Sandbox Code Playgroud)
如果此列表包含100000个项目,将生成多少个线程?
另外,每个线程都可以获得相同数量的项目,还是随机分配?
这可能听起来像一个奇怪的问题,但有没有办法在Java 8中引用Lambda的标准无操作(即null操作,空模式方法,无操作,无操作方法)方法.
目前,我有一个方法,需要一个,比方说,void foo(Consumer<Object>)我想给它一个无操作,我必须声明:
foo(new Consumer<Object>() {
public void accept(Object o) {
// do nothing
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里我希望能够做到这样的事情:
foo(Object::null)
Run Code Online (Sandbox Code Playgroud)
代替.有类似存在吗?
不确定多参数方法如何工作 - 也许这是Java中lambdas的缺陷.
如你所知,java.util.Objects是
此类包含用于对对象进行操作的静态实用程序方法.
其中一种方法是Objects.isNull().
我的理解是,Objects.isNull()通过省略第二个,可以消除意外地将空值分配给对象的可能性=.
但是,API Note指出:
此方法存在用作谓词,过滤器(Objects :: isNull)
会不会有任何理由/环境对我应该使用object == null了Objects.isNull()在if语句?
应该Objects.isNull()仅限于Predicates吗?
下面的代码给我一个编译时错误:
Thread t2 = new Thread(() -> {
try {
sleep(1000);
}
catch (InterruptedException e) {}
});
Run Code Online (Sandbox Code Playgroud)
对于类型A (其中A是我的类名),方法sleep(int)是未定义的.
然而,当我使用匿名内部类时,没有编译时错误:
Thread t1 = new Thread(){
public void run(){
try {
sleep(1000);
} catch (InterruptedException e) {}
}
};
Run Code Online (Sandbox Code Playgroud)
以下代码也可以正常工作:
Thread t3 = new Thread(() -> System.out.println("In lambda"));
Run Code Online (Sandbox Code Playgroud)
如何在lambda表达式体内工作?请帮忙.
从许多答案中,我可以看到错误可以Thread.sleep(1000)在我的第一种方法中解决.但是,如果有人能向我解释范围和上下文如何在lambda表达式中工作,我真的很感激.