标签: java-8

在 java 8 中从没有 POJO 的对象列表或流中收集为 HashMap<String,String>

我有一个对象列表,我必须从中创建一个HashMap<String,String>ConcurrentHashMap<String,String>在对列表中的每个对象应用某些逻辑之后。这是在不使用 java 8 的情况下完美运行的代码。

 for (Model model : parser.getList()) {
       String name = model.getName();
       String val = parser.getValue(arr, name);
       map.putIfAbsent(name, val);
 }
Run Code Online (Sandbox Code Playgroud)

我能够将其翻译为

Map<String, String> map = new HashMap<>();
parser.getList().forEach(model -> map.putIfAbsent(model.getName(),parser.getValue(arr,model.getName())));
Run Code Online (Sandbox Code Playgroud)

但是,我想探索 的用法,Collectors.toMap看看我是否可以在这个用例中利用它。我试图做类似下面的事情,但这不是正确的用法,因为我无法使用 params调用方法parser.getValuetoMap()

 Map<String,String> valMap = parser.getFieldList().stream().collect(Collectors.toMap(Model::getName,parser.getValue(arr,Model::getName),(left,right)->right),HashMap::new); 
Run Code Online (Sandbox Code Playgroud)

Collectors.toMap()当我创建一个 POJO ValHolder 来保存如下值时,我能够使用它。

Map<String,String> tranMap = parser.getFieldList().stream().map(model -> {
        return new ValHolder(model.getName(),parser.Value(dataArray,model.getName()));
}).collect(Collectors.toMap(ValHolder::getName,ValHolder::getValue,(x,y)->y,HashMap::new));
Run Code Online (Sandbox Code Playgroud)

为保存值而创建的 POJO 如下

class ValHolder {

    String name;
    String value;

    public String getName() {
        return name;
    } …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

如何在 Java 中使用 Optional?

我有一个服务,它从数据库中查询优惠券列表。此服务Optional向客户端返回。

return listOfCoupons.isEmpty() ? Optional.empty() : Optional.of(listOfCoupons.get(listOfCoupons.size() - 1));
Run Code Online (Sandbox Code Playgroud)

此代码的客户端Optional以以下方式使用命名的“优惠券”:

if (coupons.isPresent) {
   save (coupons.get());
} 
Run Code Online (Sandbox Code Playgroud)

这是正确的用法Optional吗?

java optional java-8

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

你将如何在java8中将方法转换为单行

我有以下方法将单行转换为地图

并想使用 java8 将其转换为单行语句

输入管道分隔的字符串,例如:status:MYSTATUS|data1:value1

public Map<String, String> getMap(String attributeUpdate){
    Map<String, String> attr = new HashMap<>();
    if(StringUtils.isNotEmpty(attributeUpdate)){
        List<String> a = Arrays.asList(attributeUpdate.split("\\|"));
        for (String s : a) {
            String[] key_val = s.split(":");
            if(key_val.length == 2) {
                attr.put(key_val[0], key_val[1]);
            }
        }
    }
    return attr;
}
Run Code Online (Sandbox Code Playgroud)

java collections java-8 java-stream

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

Java内置邻接表

我正在阅读this ,其中包含旧的java包,例如sun包。我发现其中一些很有用。

其中是sun.security.provider.certpath.Vertex,它代表一个顶点,在 Vertex 类之后是 AdjacencyList ie sun.security.provider.certpath.AdjacencyList,它代表顶点的邻接列表。

文档说

AdjacencyList 用于存储认证路径的历史记录。

这是专门为 X500 证书及其路径定义的,并忽略了无法抑制的内部 API 警告?我们可以将这些类用于解决 JDK 1.8 上的问题的通用图吗?

java sun graph adjacency-list java-8

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

Assertj 3.16.1 中是否弃用了方法“hasOnlyElementsOfType”

我有这段代码在更新到 Assertj 3.16.1 后不再有效

Throwable thrown = catchThrowable(() -> myObject.methodThrowsException());
assertThat(thrown).isInstanceOf(MyCustomException.class).extracting("fault").hasOnlyElementsOfType(CustomException.class).extracting("code").containsExactly("AnotherCustomException");
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

java:cannot find symbol
symbol: method hasOnlyElementsOfType(java.lang.Class<CustomException.class>)
location: class org.assertj.core.api.AbstractObjectAssert<capture#1 of?, capture#2 of ?>
Run Code Online (Sandbox Code Playgroud)

它要么已被弃用,要么现在以不同的方式实施。我已经浏览了文档并搜索了近两天,看看是否有任何关于如何使用它的信息,而不是以前如何使用它来实现轻松转换,但还没有找到任何东西。当我用它containsOnlyOnceElementsOf代替给出问题的那个时,我实际上得到了一个类似的错误。这些方法是否有其他替代方法可以实现相同的目的?

任何帮助将不胜感激!!!

java spring-test java-8 assertj junit5

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

一个操作数为空的 BigDecimal min() 方法

我有这个比较:

BigDecimal firstLimit = null; <<-------------------------sometimes firstLimit could be null
BigDecimal secondLimit = BigDecimal.valueof(10); <<--- sometimes secondLimit can be null
BigDecimal thirdLimit = BigDecimal.valueof(20);  <<--- sometimes thirdLimit can be null
BigDecimal minLimit = firstLimit.min(secondLimit.min(thirLimit))
Run Code Online (Sandbox Code Playgroud)

最初,我尝试设置任何最终为空的值,并使用任意上限值,但我不允许这样做。这意味着我需要为冗长的 if-else-if 去掉这个单行比较解决方案,我真的不想这样做。是否有一种优雅的方法来处理空情况。任何建议将不胜感激。谢谢你。

java bigdecimal java-8

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

Java排序列表,然后使用Stream api从列表中获取子列表

public class Result {
  ...
  private Integer averageRating;
}
Run Code Online (Sandbox Code Playgroud)

我有一个结果列表List<Result>。我想对它们进行排序averageRating,然后想要将特定索引形成为特定索引,例如 10 到 20。

我可以使用Collection.sort()using Comparator.comparing()then take sublist from list来做到这一点。但问题是更高的索引可能大于列表大小,这就是我必须手动处理的原因。像 10 到 20,但列表大小为 15,则将输出 5 个项目。

但是我如何使用 Java Stream API 做到这一点?

我尝试了一些但没有奏效:

List<Result> result = list.stream().sorted(e -> e.getAverageRating()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

如果列表中某个项目出现多次,则删除该项目的所有实例

给定一个数字列表: { 4, 5, 7, 3, 5, 4, 2, 4 }

所需的输出是: { 7, 3, 2 }

我正在考虑的解决方案是从给定的列表中在 HashMap 下创建:

Map<Integer, Integer> numbersCountMap = new HashMap();
Run Code Online (Sandbox Code Playgroud)

其中键是列表中的值,值是出现次数。

然后循环遍历 HashMap 条目集,只要数字包含的计数大于 1,就从列表中删除该数字。

for (Map.Entry<Int, Int> numberCountEntry : numbersCountMap.entrySet()) {
     if(numberCountEntry.getValue() > 1) {  
        testList.remove(numberCountEntry.getKey());
     }
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是解决此问题的有效方法,因为remove(Integer)对列表的操作可能很昂贵。此外,我正在创建额外的 Map 数据结构。并循环两次,一次在原始列表上创建地图,然后在地图上删除重复项。

你能不能提出一个更好的方法。可能是 Java 8 有更好的实现方式。我们还可以在 Java 8 中使用 Streams 和其他新结构在几行中完成吗?

java collections data-structures java-8 java-stream

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

快速 Java 匿名函数/类问题

我知道匿名函数在 JS 中是如何工作的,并且对 Java 中的部分内容有点困惑。

所以在下面我有一个匿名类(我只是使用 Thread 类作为我所看到的示例),在那里我覆盖了run()函数,然后在该类上调用.start()

new Thread() {
    @Override
    public void run() {
        System.out.println("Hello from the anonymous class thread");
    }
}.start();
Run Code Online (Sandbox Code Playgroud)

所以这是有效的,但 IntelliJ 想让我把它改写成这样:

new Thread(() -> System.out.println("Hello from the anonymous class thread")).start();
Run Code Online (Sandbox Code Playgroud)

我得到了大部分这种语法,但对如何覆盖run()函数有点困惑。根据我的理解,没有参数被传递到 Thread 类(所以没有任何参数被传递到我假设的构造函数中)。现在我感到困惑的地方就在这里。它没有在任何地方声明它覆盖run()函数。这是Thread类的特例还是我遗漏了什么?

希望我清楚地解释了这一点,并提前致谢!

java lambda multithreading anonymous-class java-8

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

Cloneable#clone 方法不必要的强制转换

class MyCls implements Cloneable {
  @Override
  protected MyCls clone() throws CloneNotSupportedException {
    return new MyCls(//...
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码没有任何问题。那么为什么CopyOnWriteArrayList#clone返回一个Object而不是CopyOnWriteArrayList?从转换回Object所需类型时,编译器会哭。毕竟,这个设计决定的原因是什么?我看到整个图书馆都在重复这种模式。

Ralph建议下面的代码是有效的,而不是上面的代码:

@Override MyCls clone() throws CloneNotSupportedException { 
  MyCls clone = (MyCls)super.clone();
  clone.x = this.x; //or what ever to do return clone
  // ...
}
Run Code Online (Sandbox Code Playgroud)

问题还是一样。为什么CopyOnWriteArrayList#clone返回Object而不是它自己?

java java-8

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