标签: java-8

在Java8函数样式中,如何将值映射到现有的键值对

我有一张地图:

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功能样式?

java dictionary java-8

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

按Java 8中的Map列表分组

我有一个像这样的列表:

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)

java lambda java-8 java-stream

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

我如何解决java2d中的ClassCastException(Bug-ID 7172749)

我有幸遭遇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)

java linux awt java-2d java-8

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

在使用Stream"filter"和"collect"之后,Java 8会创建一个新的List吗?

我有使用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].

是否所有操作都在原始列表中执行,并且不创建新列表?或者在"过滤"和"收集"操作之后,返回一个新创建的列表并忽略原始列表?

java list java-8 java-stream

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

为什么'T.super.toString()'和'super :: toString'使用合成访问器方法?

考虑以下一组表达式:

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)

java super java-8 synthetic method-reference

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

Java可选 - 如果是其他语句

经过一番阅读后我才看到了

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 if-statement optional java-8

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

Java 8:如何编写 lambda 流以使用 JsonArray?

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

你知道如何解决吗?

java lambda java-8 java-stream

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

检查映射中与Java中的List内容匹配的键

我有一个ListStringsMap.地图中的每个键都需要出现在列表中,否则我需要抛出异常.截至目前,我正在循环列表并检查密钥并在地图不包含密钥时抛出异常.下面是我正在做的示例代码.在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)

java lambda java-8 java-stream

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

使用lambda将文本文件转换为Map <String,List <String >>

我试图转换以下文本输入文件:

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 java-8 java-stream

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

为什么尝试使用内部类中的方法引用来调用超类的受保护方法时出现BootstrapMethodError?

在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 java-8

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