标签: java-8

使用lambda参数记录kotlin

在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-8 kotlin log4j2

13
推荐指数
1
解决办法
1126
查看次数

聚合Java中的对象列表

我们在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)

java aggregate-functions java-8 java-stream

13
推荐指数
2
解决办法
8298
查看次数

为什么具有显式返回的空lambda和构造函数会导致编译器错误(Java Bug?)

我有一个可重现的测试用例:

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,还是我在这里缺少一些语言设计?

编辑:这不是一个重复的构造函数如何返回一个值,这实际上是一个构造函数,并不是关于构造函数的返回值,而是变量初始化.

java lambda java-8

13
推荐指数
1
解决办法
195
查看次数

拼合列表列表的3种方法.是否有理由更喜欢其中之一?

假设我们有一个如下列表.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>>

java java-8 java-stream

13
推荐指数
2
解决办法
3万
查看次数

为什么Collectors.toMap在重复键错误上报告值而不是键?

这真的是一个关于细微问题的问题,但我的印象是在这里弄错了.如果使用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)

java java-8 java-stream collectors

13
推荐指数
2
解决办法
2888
查看次数

将Map <Integer,List <String >>展平为使用stream和lambda映射<String,Integer>

我想在不丢失密钥映射的情况下压扁MapInteger密钥与列表相关联的密钥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)

java lambda java-8 java-stream

13
推荐指数
2
解决办法
1万
查看次数

BiFunctions的组成

我有一个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流,如果没有,除了循环所有可用功能并以另一种方式组合它们之外,最优雅的方式是什么?

java java-8

13
推荐指数
2
解决办法
515
查看次数

Scala Stream与Java Stream Laziness的区别

我是懒惰评估概念的新手.当我在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中,即使我没有消耗流,它也会输出一些信息.所以我的问题是导致这种差异的原因是什么?

java scala lazy-evaluation java-8 java-stream

13
推荐指数
1
解决办法
1076
查看次数

Hadoop IOException登录失败

我对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)

authentication configuration hadoop ioexception java-8

13
推荐指数
1
解决办法
5867
查看次数

java.util.date使用DateTimeFormatter转换为String

如何使用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 datetime jodatime java-8

13
推荐指数
3
解决办法
3万
查看次数