在log4j2中,我们有一个方便的功能,描述为
// Java-8 style optimization: no need to explicitly check the log level:
// the lambda expression is not evaluated if the TRACE level is not enabled
logger.trace("Some long-running operation returned {}", () -> expensiveOperation());
Run Code Online (Sandbox Code Playgroud)
我试图在kotlin中使用它
log.debug("random {}", { UUID.randomUUID() })
Run Code Online (Sandbox Code Playgroud)
这将打印
random Function0<java.util.UUID>
Run Code Online (Sandbox Code Playgroud)
我们如何使用kotlin使用lambda参数记录?或者我们如何明确告诉kotlin要调用哪种方法?
我们在Java中有任何聚合器函数来执行以下聚合吗?
Person {
String name;
String subject;
String department;
Long mark1;
Long mark2;
Long mark3;
}
Run Code Online (Sandbox Code Playgroud)
列表包含如下数据.
Name |Subject |Department |Mark1 |Mark2 |Mark3 --------|-----------|-----------|-------|-------|----- Clark |English |DEP1 |7 |8 |6 Michel |English |DEP1 |6 |4 |7 Dave |Maths |DEP2 |3 |5 |6 Mario |Maths |DEP1 |9 |7 |8
聚合标准是Subject&Dep.结果对象需要
Subject |Department |Mark1 |Mark2 |Mark3 ----------- |-----------|-------|-------|----- English |DEP1 |13 |12 |13 Maths |DEP2 |3 |5 |6 Maths |DEP1 |9 |7 |8
可以通过手动迭代列表并创建聚合列表来实现此聚合.示例如下.
private static List<Person> getGrouped(List<Person> origList) {
Map<String, Person> …Run Code Online (Sandbox Code Playgroud) 我有一个可重现的测试用例:
public class TestCase {
private final java.util.function.Consumer<Object> emptyCallback = result -> {};
public TestCase() {
return;
}
public static void main(String... args) {
new TestCase();
}
}
Run Code Online (Sandbox Code Playgroud)
使用Java 8,更新51(Oracle JDK).使用IntelliJ和javac都无法编译.
IntelliJ输出:
Error(6, 7): java: variable result might not have been initialized
Run Code Online (Sandbox Code Playgroud)
javac输出:
TestCase.java:6: error: Variable result might not have been initialized
return;
^
1 error
Run Code Online (Sandbox Code Playgroud)
现在奇怪的是,删除return;或Consumer将修复错误.这是一个java bug,还是我在这里缺少一些语言设计?
编辑:这不是一个重复的构造函数如何返回一个值,这实际上是一个构造函数,并不是关于构造函数的返回值,而是变量初始化.
假设我们有一个如下列表.CoreResult有一个类型的领域List<Double>.
final List<CoreResult> list = new LinkedList<>(SOME_DATA);
Run Code Online (Sandbox Code Playgroud)
目标是在从每个CoreResult对象中提取特定字段后展平列表.这里有3种可能的选择.他们中的任何一个比其他人更好吗?
选项1:通过map()收集器提取字段并展平收集器内部
final List<Double> A = list.stream().map(CoreResult::getField)
.collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
Run Code Online (Sandbox Code Playgroud)
选项2:map()通过flatMap()简单的收集器提取字段
final List<Double> B = list.stream().map(CoreResult::getField)
.flatMap(Collection::stream).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
选项3:通过flatMap()简单的收集器提取一个字段并平整
final List<Double> C = list.stream().flatMap(
x -> x.getField().stream()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如果不需要从CoreResult中提取任何字段,那么答案是否会有所不同,而是想要简单地将其展平List<List<Double>>?
这真的是一个关于细微问题的问题,但我的印象是在这里弄错了.如果使用Collectors.toMap-method添加重复键,则会抛出带有"重复键"消息的异常.为什么报告的价值而不是关键?甚至两个?这真的是误导,不是吗?
这是一个证明行为的小测试:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class TestToMap {
public static void main(String[] args) {
List<Something> list = Arrays.asList(
new Something("key1", "value1"),
new Something("key2", "value2"),
new Something("key3", "value3a"),
new Something("key3", "value3b"));
Map<String, String> map = list.stream().collect(Collectors.toMap(o -> o.key, o -> o.value));
System.out.println(map);
}
private static class Something {
final String key, value;
Something(final String key, final String value){
this.key = key;
this.value = value;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想在不丢失密钥映射的情况下压扁Map将Integer密钥与列表相关联的密钥String.我很好奇,好像用stream和做这样做是有用的和有用的lambda.
我们从这样的事情开始:
Map<Integer, List<String>> mapFrom = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
我们假设mapFrom填充在某处,看起来像:
1: a,b,c
2: d,e,f
etc.
Run Code Online (Sandbox Code Playgroud)
我们还假设列表中的值是唯一的.
现在,我想"展开"它以获得第二张地图:
a: 1
b: 1
c: 1
d: 2
e: 2
f: 2
etc.
Run Code Online (Sandbox Code Playgroud)
我可以这样做(或非常相似,使用foreach):
Map<String, Integer> mapTo = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry: mapFrom.entrySet()) {
for (String s: entry.getValue()) {
mapTo.put(s, entry.getKey());
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我们假设我想使用lambda而不是嵌套for循环.我可能会这样做:
Map<String, Integer> mapTo = mapFrom.entrySet().stream().map(e -> {
e.getValue().stream().?
// Here I can iterate on …Run Code Online (Sandbox Code Playgroud) 我有一个BiFunction流,我想减少到一个BiFunction.
更具体地说,我有一系列BiFunctions
BiFunction<x,y,y>
Run Code Online (Sandbox Code Playgroud)
其中x和y表示参数的类型.
假设我有两个功能
f (x, y) -> y
g (x, y) -> y
Run Code Online (Sandbox Code Playgroud)
我想把它们组合成函数
h(x, y) -> f(x, g(x, y))
Run Code Online (Sandbox Code Playgroud)
这是否可以使用Java 8流,如果没有,除了循环所有可用功能并以另一种方式组合它们之外,最优雅的方式是什么?
我是懒惰评估概念的新手.当我在Scala中执行这行代码时;
"12334".grouped(1).toStream.filter{n => println("n:" +n ); n=="3";}
Run Code Online (Sandbox Code Playgroud)
打印出来:
n:1
n:2
n:3
Run Code Online (Sandbox Code Playgroud)
但是当我在Java中运行类似的东西时,例如:
List<String> myList = new ArrayList<>(Arrays.asList("12334".split("")));
Stream<String> myList2 = myList.stream().filter(a -> {System.out.println("a:" +a);return "3".equals(a);});
Run Code Online (Sandbox Code Playgroud)
它无声地终止,无需向控制台行写任何内容.Java的行为对我来说似乎更合理,因为Streams被懒惰地评估,我没有收集或尝试打印结果.但是在Scala中,即使我没有消耗流,它也会输出一些信息.所以我的问题是导致这种差异的原因是什么?
我对Hadoop很新.但是,我已经能够在我的服务器上以群集模式成功设置带有Java 7的hadoop 2.7.3.一切都很好.
但是,当我尝试切换到Java 8并启动dfs时,出现错误:
Exception in thread "main" java.io.IOException: failure to login
at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:824)
at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:761)
at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:634)
at org.apache.hadoop.hdfs.tools.GetConf.run(GetConf.java:315)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
at org.apache.hadoop.hdfs.tools.GetConf.main(GetConf.java:332)
Caused by: javax.security.auth.login.LoginException: java.lang.NullPointerException: invalid null input: name
at com.sun.security.auth.UnixPrincipal.<init>(UnixPrincipal.java:71)
at com.sun.security.auth.module.UnixLoginModule.login(UnixLoginModule.java:133)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:755)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:195)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:682)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
at javax.security.auth.login.LoginContext.login(LoginContext.java:587)
at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:799)
at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:761)
at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:634)
at org.apache.hadoop.hdfs.tools.GetConf.run(GetConf.java:315)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
at org.apache.hadoop.hdfs.tools.GetConf.main(GetConf.java:332)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:856)
at …Run Code Online (Sandbox Code Playgroud) 如何使用java将java.util.Date转换为String
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss")
Run Code Online (Sandbox Code Playgroud)
我得到的Date对象被传递
DateTime now = new DateTime(date);
Run Code Online (Sandbox Code Playgroud) java-8 ×10
java ×8
java-stream ×5
lambda ×2
collectors ×1
datetime ×1
hadoop ×1
ioexception ×1
jodatime ×1
kotlin ×1
log4j2 ×1
scala ×1