我有一个对象列表,我必须从中创建一个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) 我有一个服务,它从数据库中查询优惠券列表。此服务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吗?
我有以下方法将单行转换为地图
并想使用 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) 我正在阅读this ,其中包含旧的java包,例如sun包。我发现其中一些很有用。
其中是sun.security.provider.certpath.Vertex,它代表一个顶点,在 Vertex 类之后是 AdjacencyList ie sun.security.provider.certpath.AdjacencyList,它代表顶点的邻接列表。
从文档说,
AdjacencyList 用于存储认证路径的历史记录。
这是专门为 X500 证书及其路径定义的,并忽略了无法抑制的内部 API 警告?我们可以将这些类用于解决 JDK 1.8 上的问题的通用图吗?
我有这段代码在更新到 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代替给出问题的那个时,我实际上得到了一个类似的错误。这些方法是否有其他替代方法可以实现相同的目的?
任何帮助将不胜感激!!!
我有这个比较:
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 去掉这个单行比较解决方案,我真的不想这样做。是否有一种优雅的方法来处理空情况。任何建议将不胜感激。谢谢你。
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) 给定一个数字列表: { 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 和其他新结构在几行中完成吗?
我知道匿名函数在 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类的特例还是我遗漏了什么?
希望我清楚地解释了这一点,并提前致谢!
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 ×10
java-8 ×10
java-stream ×4
collections ×2
assertj ×1
bigdecimal ×1
graph ×1
junit5 ×1
lambda ×1
optional ×1
spring-test ×1
sun ×1