从HashMap文档中我们可以读到:
请注意,使用具有相同 hashCode() 的多个键肯定会降低任何哈希表的性能。为了减轻影响,当键是 Comparable 时,此类可以使用键之间的比较顺序来帮助打破平局。
我知道如果密钥实现Comparable接口,在许多哈希冲突时,桶可以从 转变List为TreeSet。
是否可以设置容量,或检查何时转换?
我有一个类似如下所示的 json。需求是根据id获取key值。IE。假设如果 Id 是 A1键值应返回2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs。键数组始终只包含一个元素。
{
"keys": [
{
"id": "A1",
"key": [
"2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs"
]
},
{
"id": "A2",
"key": [
"swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew"
]
},
{
"id": "A3",
"key": [
"EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
为了实现上述内容,我使用 Java8 Stream 编写了以下代码,但问题是它返回了Optional<KeyDetails>我需要再次解析并获取键值的内容
String keyDetails = "{\"keys\":[{\"id\":\"A1\",\"key\":[\"2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs\"]},{\"id\":\"A2\",\"key\":[\"swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew\"]},{\"id\":\"A3\",\"key\":[\"EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2\"]}]}";
AccessKeys accessKeys = new ObjectMapper().readValue(keyDetails, AccessKeys.class);
Optional<KeyDetails> filteredKey = accessKeys.getKeys().stream().filter(key-> key.getId().equals("A3")).findAny();
if(filteredKey.isPresent()) {
String keyValue = filteredKey.get().getKey().get(0);
System.out.println("keyValue==>"+keyValue);
}
Run Code Online (Sandbox Code Playgroud)
我想要的是得到Optional<String>而不是Optional<KeyDetails>。即,如果 id 存在,它应该只返回键数组中存在的键值。
json 满足的一些条件是:
谁能帮我解决这个问题
在java 8中,我使用Streams打印输出,但大小为0。为什么?
public class IntermediateryAndFinal {
public static void main(String[] args) {
Stream<String> stream = Stream.of("one", "two", "three", "four", "five");
Predicate<String> p1 = Predicate.isEqual("two");
Predicate<String> p2 = Predicate.isEqual("three");
List<String> list = new ArrayList<>();
stream.peek(System.out::println)
.filter(p1.or(p2))
.peek(list::add);
System.out.println("Size = "+list.size());
}
}
Run Code Online (Sandbox Code Playgroud) 我用来从一个对象Lombok-Builder构建我的apijava对象entity
RewardApi.builder()
.rewardId(rewardEntity.getrewardId())
.rewardTitle(rewardEntity.getrewardTitle())
.rewardText(rewardEntity.getrewardText())
.rewardFor(rewardEntity.getrewardFor())
.rewardType(rewardEntity.getrewardType())
.rewardFromDate(rewardEntity.getrewardFromDate().toZonedDateTime())
.rewardToDate(rewardEntity.getrewardToDate().toZonedDateTime())
.isDisplayOn(rewardEntity.getIsDisplayOn())
.createdId(rewardEntity.getCreatedId())
.updatedId(rewardEntity.getUpdatedId())
.createdDate(rewardEntity.getCreatedDate().toZonedDateTime())
.lastModifiedDate(rewardEntity.getLastModifiedDate().toZonedDateTime())
.build();
Run Code Online (Sandbox Code Playgroud)
我nullPointerException在设置lastModifiedDate字段时得到了结果,因为entity对象正在获取该字段并且null正在toZonedDateTime()执行null
如何在不使用传统方式(如下所述)的情况下解决这个问题
if (null!=rewardEntity.getLastModifiedDate(){....}
我想null在使用设置变量时进行检查builder-pattern,而不是null在构建对象后进行检查。无论如何 ?

VS Code(代码运行器扩展)是否支持 JDK 1.8?早上我使用的是 JDK 12 ,但后来我降级到 JDK 1.8 来尝试小程序查看器和其他东西。不幸的是现在它甚至没有突出显示代码。
有人请告诉我问题及其解决方案。
我正在学习 Java 8 以及更详细的“CompletableFuture”。遵循这个有趣的教程: https://www.callicoder.com/java-8-completablefuture-tutorial/
我编写了以下 Java 类:
package parallels;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
public class Test {
private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0";
private static final Executor executor = Executors.newFixedThreadPool(100);
public static void main(String[] args) {
List<String> webPageLinks= new ArrayList<String>();
for (int i=0;i<30;i++) {
webPageLinks.add("http://jsonplaceholder.typicode.com/todos/1");
}
// Download contents of all the …Run Code Online (Sandbox Code Playgroud) public class Element {
private Long id;
private String groupType;
}
Run Code Online (Sandbox Code Playgroud)
我有元素列表。具有不同组类型的列表,例如“group1”、“group2”{1,group1}、{2,group1}、{3,group2}{4,group2}
我想为每个组创建两个不同列表的地图,但使用 ids(Map>) 而不是使用 Element 对象 Map>
下面的代码对于 Map> ie 工作正常
Map<String, List<Element>> elementByGroup = new HashMap<>();
elementByGroup = element.stream().collect(
Collectors.groupingBy(Element::getGroupType));
Run Code Online (Sandbox Code Playgroud)
如何以 Map<String, List<Long>> 的形式收集结果。我知道通过迭代 Map,然后迭代列表,我们可以在没有 java 8 的情况下获得 id 列表。但是我想通过在 groupingby 函数之后使用上面的代码进行操作来执行相同的操作。
的文档Supplier::get并未明确说明其返回的可能性或不返回null。是否可以 ?
我想这可能是a的情况Supplier<Void>。在这种情况下,我如何调用 mySupplier以确保它不会导致Supplier<Void>?换句话说,哪一个T是这样的以至于它可以不是Void?
我有一个List<Map<String, String>>。我想将其转换为单个地图。
列表大小可以是 1..n。不确定如何使用 Java 8 Stream 来做到这一点?
List<Map<String, String>> mapList = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("1", "One");
map1.put("2", "Two");
Map<String, String> map2 = new HashMap<>();
map2.put("3", "Three");
map2.put("4", "Four");
mapList.add(map1);
mapList.add(map2);
Map<String, String> finalMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
我们可以在 Java 7 中做这样的事情:
for(Map<String, String> map : mapList) {
for(String key : map.keySet()) {
finalMap.put(key, map.get(key));
}
}
System.out.println("Final Map " + finalMap); // Final Map {1=One, 2=Two, 3=Three, 4=Four}
Run Code Online (Sandbox Code Playgroud) 我想使用具有 xml 配置的属性文件注入列表值。
<property name="headerOfFile">
<util:list id="headerOfFileList" value-type="java.lang.String">
<value>headerA</value>
<value>headerB</value>
</util:list>
</property>
Run Code Online (Sandbox Code Playgroud)
我想使用 xml bean 配置通过属性文件注入我的列表值。我知道使用 Java 我们可以这样做:
@Value("#{'${my.list.of.header.strings}'.split(',')}")
private List<String> headerOfFile;
Run Code Online (Sandbox Code Playgroud)
假设我的属性文件已正确加载,如下所示:
my.list.of.header.strings=headerA,headerB
Run Code Online (Sandbox Code Playgroud)
但我的要求是使用带有属性文件的 xml beans 来完成此操作。