说我有以下代码
data.stream()
.map(x -> {
Object a = maybeReturnsNull(x);
return a == null ? defaultValue : a;
})
Run Code Online (Sandbox Code Playgroud)
我有一些可能正在返回的函数,null我将它应用于流的一个元素.然后我想确保将任何null结果更改为某个默认值.与使用上一个定义辅助变量a并在lambda表达式中使用代码块的示例相比,使用两个映射(如下例)之间是否存在任何显着差异?
data.stream()
.map(x -> maybeReturnsNull(x))
.map(x -> x == null ? defaultValue : x)
Run Code Online (Sandbox Code Playgroud)
有没有标准在哪里或不避免使用lambda函数的块语句?
有没有办法Eclipse Mars JDT强制执行新的,更严格的JDK8"doclint"标准,以便Eclipse中的错误级别与javadoc工具匹配?
似乎有很多关于禁用Linter的文章,但我想反过来说:保持开启并"修复"我的javadoc注释.
Eclipse中似乎没有任何合规性设置来强制执行某些规则,例如使用HTML实体而不是<和>文字,标记结束规则,禁止XHTML样式自关闭标记等.
我是lambda表达的新手,并试图在我的任务中使用它.
问题:
我有两个地图m1和m2类型Map<Integer, String>,必须合并到一个地图中
Map<Integer, List<String>>,其中两个地图中相同键的值被收集到一个列表中并放入一个新的地图中.
基于我探索的解决方案:
Map<Integer, List<String>> collated =
Stream.concat(m1.entrySet().stream(), m2.entrySet().stream()).collect(
Collectors.toMap(Entry::getKey,
Entry::getValue, (a, b) -> {
List<String> merged = new ArrayList<String>(a);
merged.addAll(b);
return merged;
}));
Run Code Online (Sandbox Code Playgroud)
但是,这种解决方案预计源List是Map<Integer, List<String>>如在toMap合并函数需要操作数和结果是相同的类型.
我不想更改源集合.请提供您使用lambda表达式实现此目的的输入.
我正在寻找最简洁的方法来过滤Java-8中的列表,使用简单的lambda Predicate,而无需创建新列表.
特别是,这个解决方案不适合,因为toList()返回一个新的List:
List<Person> beerDrinkers = persons.stream()
.filter(p -> p.getAge() > 16)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
请注意,以下解决方案也不起作用,因为列表应该是clear()其原始值的ed(但显然,如果在过滤之前清除它,则没有任何内容可以过滤...):
persons.stream()
.filter(p -> p.getAge() > 16)
.forEach((p) -> persons.add(p));
Run Code Online (Sandbox Code Playgroud)
(另外,我更喜欢不涉及使用第三方库或框架的解决方案)
当开始jetty-distribution-9.3.0.v20150612有openjdk 1.8.0_51一个亚马逊EC2 Linux机器上运行,是所有配置的ECDHE套房不支持打印.
2015-08-12 16:51:20 main SslContextFactory [INFO] Cipher TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 not supported
2015-08-12 16:51:20 main SslContextFactory [INFO] Cipher TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 not supported
2015-08-12 16:51:20 main SslContextFactory [INFO] Cipher TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 not supported
2015-08-12 16:51:20 main SslContextFactory [INFO] Cipher TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 not supported
2015-08-12 16:51:20 main SslContextFactory [INFO] Cipher TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 not supported
2015-08-12 16:51:20 main SslContextFactory [INFO] Cipher TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 not supported
2015-08-12 16:51:20 main SslContextFactory [INFO] Cipher TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 not supported
2015-08-12 16:51:20 main SslContextFactory [INFO] Cipher TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 not supported
2015-08-12 …Run Code Online (Sandbox Code Playgroud) Java 8引入了获取并发Set实现的新方法
// Pre-Java-8 way to create a concurrent set
Set<String> oldStyle = Collections.newSetFromMap(new ConcurrentHashMap<>());
// New method in Java 8
Set<String> newStyle = ConcurrentHashMap.newKeySet();
Run Code Online (Sandbox Code Playgroud)
有什么理由喜欢新方法吗?
有什么优点/缺点?
在阅读Stream界面源代码时,我发现了这个方法签名:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么输入类型mapper是? super T输出类型? extends R,为什么不? extends用于两者?
我正在寻找一种方法来调用多个参数方法,但使用一个lambda构造.在文档中,据说lambda只有在它可以映射到功能界面时才可用.
我想做的事情如下:
test((arg0, arg1) -> me.call(arg0, arg1));
test((arg0, arg1, arg2) -> me.call(arg0, arg1, arg2));
...
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以优雅地做到这一点而不定义10个接口,每个参数计数一个?
更新
我使用从非方法接口扩展的多个接口,并重载该方法.
两个参数的示例:
interface Invoker {}
interface Invoker2 extends Invoker { void invoke(Object arg0, Object arg1);}
void test(Invoker2 invoker, Object ... arguments) {
test((Invoker)invoker, Object ... arguments);
}
void test(Invoker invoker, Object ... arguments) {
//Use Reflection or whatever to access the provided invoker
}
Run Code Online (Sandbox Code Playgroud)
我希望有可能用一个解决方案替换10个调用者接口和10个重载方法.
我有一个合理的用例,请不要问诸如"你为什么要做这样的事情?"之类的问题.并且'你想解决的问题是什么?' 或类似的东西.只要知道我已经考虑过这一点,这是我试图解决的合法问题.
很抱歉添加混淆调用它调用程序,但它实际上是在我当前的用例(测试构造函数合同)中调用它.
基本上,如上所述,考虑一个在其中使用不同数量的属性的方法lambda.
我试图改变主意思考功能方式,并且最近面临一种情况,我需要从列表中获取元素,直到满足条件,我找不到一种简单的自然方式来实现这一点.显然我还在学习.
说我有这个清单:
List<String> tokens = Arrays.asList("pick me", "Pick me", "pick Me",
"PICK ME", "pick me and STOP", "pick me", "pick me and Stop", "pick me");
// In a non lambdas was you would do it like below
List<String> myTokens = new ArrayList<>();
for (String token : tokens) {
myTokens.add(token);
if (token.toUpperCase().endsWith("STOP")) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
提前感谢您的意见
注意:在发布之前,我读了一个谓词限制流,但我看不出如何能够根据我的问题调整答案.任何帮助将不胜感激.
众所周知,多个interfaces可以用Java实现.他们的实施顺序是否重要?我的意思是,正在实施B,C与C,B相同Java 8吗?我的测试显示顺序确实很重要 - 但任何人都可以解释这背后的逻辑吗?
public interface A {
public default void display() {
System.out.println("Display from A");
}
}
public interface B extends A {
public default void display() {
System.out.println("Display from B");
}
}
public interface C extends A {
public void display();
}
public interface D extends B, C {
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.如果我将订单更改B, C为C, B,则会出错:The default method display() inherited from B conflicts with another method inherited from C.
public …Run Code Online (Sandbox Code Playgroud)