我有一个这样的课:
class MultiDataPoint {
private DateTime timestamp;
private Map<String, Number> keyToData;
}
Run Code Online (Sandbox Code Playgroud)
我想为每个MultiDataPoint生成
class DataSet {
public String key;
List<DataPoint> dataPoints;
}
class DataPoint{
DateTime timeStamp;
Number data;
}
Run Code Online (Sandbox Code Playgroud)
当然,在多个MultiDataPoints中,"key"可以是相同的.
所以给定一个List<MultiDataPoint>,我如何使用Java 8流转换为List<DataSet>?
这就是我目前在没有流的情况下进行转换的方式:
Collection<DataSet> convertMultiDataPointToDataSet(List<MultiDataPoint> multiDataPoints)
{
Map<String, DataSet> setMap = new HashMap<>();
multiDataPoints.forEach(pt -> {
Map<String, Number> data = pt.getData();
data.entrySet().forEach(e -> {
String seriesKey = e.getKey();
DataSet dataSet = setMap.get(seriesKey);
if (dataSet == null)
{
dataSet = new DataSet(seriesKey);
setMap.put(seriesKey, dataSet);
}
dataSet.dataPoints.add(new DataPoint(pt.getTimestamp(), …Run Code Online (Sandbox Code Playgroud) 我想要做的是在下面的2个流调用中显示.我想根据某些条件将一个集合拆分为两个新集合.理想情况下,我想在1中进行.我已经看到了用于.map函数的条件,但找不到forEach的任何内容.实现我想要的最好方法是什么?
animalMap.entrySet().stream()
.filter(pair-> pair.getValue() != null)
.forEach(pair-> myMap.put(pair.getKey(), pair.getValue()));
animalMap.entrySet().stream()
.filter(pair-> pair.getValue() == null)
.forEach(pair-> myList.add(pair.getKey()));
Run Code Online (Sandbox Code Playgroud) 我正在寻找可以使收集流,但是是安全的方法.如果collection为null,则返回空流.像这样:
Utils.nullSafeStream(collection).filter(...);
Run Code Online (Sandbox Code Playgroud)
我创建了自己的方法:
public static <T> Stream<T> nullSafeStream(Collection<T> collection) {
if (collection == null) {
return Stream.empty();
}
return collection.stream();
}
Run Code Online (Sandbox Code Playgroud)
但我很好奇,如果标准JDK中有这样的东西?
运行selenium脚本时,我在Eclipse控制台中收到以下错误消息:
类已由更新版本的Java环境(类文件版本53.0)编译,此版本的Java Runtime仅识别最高为52.0的类文件版本.
Java版本:8
IDE:Eclipse Oxygen
Firefox版本:46
我遇到过使用方法引用但没有使用lambdas的问题.该代码如下:
(Comparator<ObjectNode> & Serializable) SOME_COMPARATOR::compare
Run Code Online (Sandbox Code Playgroud)
或者,与lambda,
(Comparator<ObjectNode> & Serializable) (a, b) -> SOME_COMPARATOR.compare(a, b)
Run Code Online (Sandbox Code Playgroud)
从语义上讲,它是完全相同的,但实际上它是不同的,因为在第一种情况下,我在其中一个Java序列化类中得到一个异常.我的问题不是关于这个例外,因为实际的代码是在一个更复杂的上下文中运行的,这个上下文已经被证明在序列化方面有奇怪的行为,所以如果我提供更多的细节,它会让它太难以回答.
我想要了解的是这两种创建lambda表达式的方法之间的区别.
对于以下Period计算:
Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 9, 2))
Run Code Online (Sandbox Code Playgroud)
结果是:
P1M1D
Run Code Online (Sandbox Code Playgroud)
这相当于31天+ 1天= 32天.
为此Period:
Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 10, 2))
Run Code Online (Sandbox Code Playgroud)
结果是:
P2M1D
Run Code Online (Sandbox Code Playgroud)
这相当于:31天(8月)+ 30天(9月)+ 1(10月)= 62天
包中是否有一个方法java.time可以给出一个天数Period?我找不到一个.不确定我是否忽略了任何东西,或者它是否只是在那里.
我还在学习Lambda,请原谅我如果我做错了什么
final Long tempId = 12345L;
List<Entry> updatedEntries = new LinkedList<>();
for (Entry entry : entryList) {
entry.setTempId(tempId);
updatedEntries.add(entityManager.update(entry, entry.getId()));
}
//entryList.stream().forEach(entry -> entry.setTempId(tempId));
Run Code Online (Sandbox Code Playgroud)
似乎forEach只能为一个语句执行.它不会返回更新的流或函数以进一步处理.我可能完全选择了错误的一个.
有人可以指导我如何有效地做到这一点?
还有一个问题,
public void doSomething() throws Exception {
for(Entry entry: entryList){
if(entry.getA() == null){
printA() throws Exception;
}
if(entry.getB() == null){
printB() throws Exception;
}
if(entry.getC() == null){
printC() throws Exception;
}
}
}
//entryList.stream().filter(entry -> entry.getA() == null).forEach(entry -> printA()); something like this?
Run Code Online (Sandbox Code Playgroud)
如何将其转换为Lambda表达式?
完整的错误消息:JDK缺少和需要运行一些NetBeans模块请使用--jdkhome命令行选项来指定JDK安装或看到http://wiki.netbeans.org/FaqRunningOnJre以获取更多信息.
一些细节:我刚刚第一次在Linux mint上安装了Netbeans,当我启动它时打开模块时会出现此错误消息.但我确实安装了jdk.
$ java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
Run Code Online (Sandbox Code Playgroud)
$ javac -version
javac 1.8.0_66
Run Code Online (Sandbox Code Playgroud) 我有一个List<Users>.我想用特定的用户名获取流中(第一个)用户的索引.我不想竟要求User将.equals()一些描述User,只是为了有相同的用户名.
我可以想到这样做的丑陋方法(迭代和计数),但感觉应该有一个很好的方法来做到这一点,可能是通过使用Streams.到目前为止,我所拥有的最好的是:
int index = users.stream()
.map(user -> user.getName())
.collect(Collectors.toList())
.indexOf(username);
Run Code Online (Sandbox Code Playgroud)
这不是我写过的最糟糕的代码,但它并不好.它也不是那么灵活,因为它依赖于一个带有.equals()描述你正在寻找的属性的函数的类型的映射函数; 我宁愿有一些可以随心所欲的东西Function<T, Boolean>
谁知道怎么样?