我有一张地图:
Map<String, List<Object>> dataMap;
Run Code Online (Sandbox Code Playgroud)
现在我想向地图添加新的键值对,如下所示:
if(dataMap.contains(key)) {
List<Object> list = dataMap.get(key);
list.add(someNewObject);
dataMap.put(key, list);
} else {
List<Object> list = new ArrayList();
list.add(someNewObject)
dataMap.put(key, list);
}
Run Code Online (Sandbox Code Playgroud)
我如何使用Java8功能样式?
我有一个像这样的列表:
List<Map<String, Long>>
Run Code Online (Sandbox Code Playgroud)
有没有办法,使用lambda,将此列表转换为:
Map<String, List<Long>>
Run Code Online (Sandbox Code Playgroud)
例:
Map<String, Long> m1 = new HashMap<>();
m1.put("A", 1);
m1.put("B", 100);
Map<String, Long> m2 = new HashMap<>();
m2.put("A", 10);
m2.put("B", 20);
m2.put("C", 100);
List<Map<String, Long>> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);
Run Code Online (Sandbox Code Playgroud)
格式化后:
Map<String, List<Long>> afterFormatting;
Run Code Online (Sandbox Code Playgroud)
看起来像是这样的:
A -> [1, 10]
B -> [100, 20]
C -> [100]
Run Code Online (Sandbox Code Playgroud) 我有幸遭遇java8中的一个错误,对于其他任何人来说这似乎都不是一个大问题,因此Oracle不会在java9之前修复它.
该缺陷有错误-ID 7172749(还要注意相关的和重复的错误),它只是碰巧所有的时间有一定的Linux机器上.
我在使用jdk1.8.0_u66的Ubuntu 14.04.3 LTS上遇到了问题.
但是,在Ubuntu 12.04.3 LTS和相同 JDK版本的另一个盒子上,我根本无法重现这个问题.
让我感到困惑的是,对于其他任何人来说,这似乎并不是一个显而易见的事情,所以我想也许我正在犯一个特别的转储错误.我正在运行Oracle-JDK(而不是OpenJDK),因为我们的客户使用相同的版本(尽管在Windows上)并且想法是接近他们的环境.
所以,我的问题是,如何解决这个问题(例如,安装X11-library xy,使用魔法-XXjava2dfailsafe参数启动我的java程序或沿着这些行开始)
并加入一群可以舒服地等待实际的人问题由oracle修复?
最好的问候Tobi
顺便说一句,我的stackstrace看起来像这样:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.BufImgSurfaceData cannot be cast to sun.java2d.xr.XRSurfaceData
at sun.java2d.xr.XRPMBlitLoops.cacheToTmpSurface(XRPMBlitLoops.java:145)
at sun.java2d.xr.XrSwToPMBlit.Blit(XRPMBlitLoops.java:353)
at sun.java2d.SurfaceDataProxy.updateSurfaceData(SurfaceDataProxy.java:498)
at sun.java2d.SurfaceDataProxy.replaceData(SurfaceDataProxy.java:455)
at sun.java2d.SurfaceData.getSourceSurfaceData(SurfaceData.java:233)
at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:566)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:67)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1014)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3318)
at sun.awt.image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:813)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1021)
[...]
Run Code Online (Sandbox Code Playgroud) 我有使用Java8的代码:
List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(5);
list.add(4);
list.add(2);
list.add(5);
list = list.stream().filter(i -> i >= 3).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
原始列表是[3,5,4,2,5].在"过滤"和"收集"操作之后,列表变为[3,5,4,5].
是否所有操作都在原始列表中执行,并且不创建新列表?或者在"过滤"和"收集"操作之后,返回一个新创建的列表并忽略原始列表?
考虑以下一组表达式:
class T {{
/*1*/ super.toString(); // direct
/*2*/ T.super.toString(); // synthetic
Supplier<?> s;
/*3*/ s = super::toString; // synthetic
/*4*/ s = T.super::toString; // synthetic
}}
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
class T {
T();
0 aload_0 [this]
1 invokespecial java.lang.Object() [8]
4 aload_0 [this]
5 invokespecial java.lang.Object.toString() : java.lang.String [10]
8 pop // ^-- direct
9 aload_0 [this]
10 invokestatic T.access$0(T) : java.lang.String [14]
13 pop // ^-- synthetic
14 aload_0 [this]
15 invokedynamic 0 get(T) : java.util.function.Supplier [21]
20 astore_1 [s] …Run Code Online (Sandbox Code Playgroud) 经过一番阅读后我才看到了
if (optional.isPresent()) {
//do smth
}
Run Code Online (Sandbox Code Playgroud)
不是使用Optional的首选方法(http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html).但如果我有这样的if语句:
if (optional.isPresent()) {
car = getCar(optional.get());
} else {
car = new Car();
car.setName(carName);
}
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?还是有更推荐的方法?
我对 Java 8 lambdas 和其他东西很陌生……我想编写一个 lambda 函数,它接受 a JSONArray,遍历它的JSONObjects 并创建某个字段的值列表。
例如,一个函数接受JSONArray:[{name: "John"}, {name: "David"}]并返回一个列表["John", "David"]。
我写了以下代码:
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class Main {
public static void main(String[] args) {
JSONArray jsonArray = new JSONArray();
jsonArray.add(new JSONObject().put("name", "John"));
jsonArray.add(new JSONObject().put("name", "David"));
List list = (List) jsonArray.stream().map(json -> json.toString()).collect(Collectors.toList());
System.out.println(list);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误:
线程“main”中的异常 java.lang.NullPointerException
你知道如何解决吗?
我有一个List的Strings和Map.地图中的每个键都需要出现在列表中,否则我需要抛出异常.截至目前,我正在循环列表并检查密钥并在地图不包含密钥时抛出异常.下面是我正在做的示例代码.在Java8中是否有任何其他方式我们可以在一行中使用streams和使用filters?
此外,列表中的内容和地图中的键应匹配.我已经在单独的if条件下处理了.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestClass {
public static void main(String[] args) {
List<String> ll = new ArrayList<>();
Map<String, Integer> m = new HashMap<>();
ll.add("a");
ll.add("b");
ll.add("d");
m.put("a", 1);
m.put("b", 1);
m.put("c", 1);
if(ll.size() != m.size){
System.out.println("Throw Exception");
}
for(String s : ll) {
if(!m.containsKey(s)) {
System.out.println("Throw Exception");
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我试图转换以下文本输入文件:
A=groupA1
A=groupA2
A=groupA3
B=groupB1
B=groupB2
Run Code Online (Sandbox Code Playgroud)
成Map<String, List<String>>通过划分在每一行"="
到目前为止,我想要获得这种输出:
KEY: A
VALUE: A=groupA1
VALUE: A=groupA2
VALUE: A=groupA3
KEY: B
VALUE: B=groupB1
VALUE: B=groupB2
Run Code Online (Sandbox Code Playgroud)
使用这样的代码:
File reqFile = new File("test.config");
try (Stream<String> stream = Files.lines(reqFile.toPath())) {
Map<String, List<String>> conf = stream.collect(Collectors.groupingBy(s -> s.split("=")[0]));
for (Map.Entry<String, List<String>> entry: conf.entrySet()) {
System.out.println("KEY: " + entry.getKey());
for (String value : entry.getValue()) {
System.out.println("VALUE: " + value);
}
}
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
如何调整上面的lambda得到这样的东西:
KEY: A
VALUE: groupA1
VALUE: …Run Code Online (Sandbox Code Playgroud) 在Java 8,给出一个超类Super的包a和一个子类Sub的包b,谁拥有一个内部类SubInner:
// Super.java
package a;
public abstract class Super {
private long value;
protected final void setValue(long value) {
this.value = value;
}
}
//Sub.java
package b;
public class Sub extends Super {
public void foo() {
new SubInner().foo();
}
private class SubInner {
void foo() {
Optional.of(1L).ifPresent(Sub.this::setValue); // Will throw IllegalAccessError at runtime.
Optional.of(1L).ifPresent(t -> setValue(t)); // However, lambda works.
setValue(1L); // also works.
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么在正常方法调用可以访问超类方法的情况下,方法引用在这种情况下无法工作 …
java ×10
java-8 ×10
java-stream ×5
lambda ×3
awt ×1
dictionary ×1
if-statement ×1
java-2d ×1
linux ×1
list ×1
optional ×1
super ×1
synthetic ×1