List<SortDTO> list = ImmutableList.of( new SortDTO("300"), new SortDTO("50"), new SortDTO("200"), new SortDTO("220")); SortDTO[] array = new SortDTO[list.size()];list.toArray(array); log.info("搜索之前:{}", JSON.toJSONString(array)); Arrays.sort(array, Comparator.comparing(SortDTO::getSortTarget)); log.info("先排序,结果为:{}", JSON.toJSONString(array));int index = Arr ays.binarySearch(array, new SortDTO("200"), Comparator.comparing(SortDTO::getSortTarget));if(ind ex<0){ throw new RuntimeException("没有找到 200");} log.info("搜索结果:{}", JSON.toJSONString(array[index]));解释一下
时间: 2024-04-25 21:28:04 浏览: 9
这段代码主要是对一个 SortDTO 的数组进行排序和查找操作。首先,定义了一个包含四个 SortDTO 对象的不可变列表,并将其转换为数组。然后,使用 Arrays.sort() 方法对该数组进行排序,排序的依据是 SortDTO 对象中的 sortTarget 字段。接着,使用 Arrays.binarySearch() 方法在数组中查找 sortTarget 字段为 "200" 的 SortDTO 对象,如果找到则返回该对象在数组中的索引,否则抛出异常。最后,输出排序后的数组和查找结果。
相关问题
List<Integer> list1=map.getOrDefault(i,new ArrayList<Integer>);这段代码的问题
这段代码的问题在于,getOrDefault()方法的第二个参数应该是一个Integer类型的默认值,而不是一个ArrayList<Integer>类型的默认值。正确的写法应该是:List<Integer> list1 = map.getOrDefault(i, new ArrayList<>());
// 分成 10 个线程并行处理数据 int threadNum = 10; int dataSizePerThread = awardIds.size() / threadNum; List<CompletableFuture<List<TCaAwardInfo>>> futures = new ArrayList<>(); for (int i = 0; i < threadNum; i++) { int startIndex = i * dataSizePerThread; int endIndex = (i == threadNum - 1) ? awardIds.size() : (i + 1) * dataSizePerThread; List<Long> subList = awardIds.subList(startIndex, endIndex); CompletableFuture<List<TCaAwardInfo>> future = CompletableFuture.supplyAsync(() -> { List<TCaAwardInfo> result = new ArrayList<>(); List<TCaAwardInfo> tCaAwardInfos = awardApiService.queryActivationCode(subList); result.addAll(tCaAwardInfos); return result; }, taskExecutor); futures.add(future); } // 等待所有线程执行完毕 CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); allFutures.join(); // 合并结果 List<TCaAwardInfo> activationCodeList = futures.stream() .flatMap(future -> future.join().stream()) .collect(Collectors.toList()); 优化一下这个代码
这段代码的并行处理数据的逻辑已经很好了,可以考虑在结果合并的时候进行优化。可以使用`CompletableFuture.join()`方法替代`CompletableFuture.join().stream()`,这样可以避免创建Stream对象,提高代码执行效率。同时,可以考虑使用`addAll()`方法替代`flatMap()`和`collect(Collectors.toList())`方法,从而避免创建Stream对象和List对象,提高代码执行效率。代码改进后如下:
```
int threadNum = 10;
int dataSizePerThread = awardIds.size() / threadNum;
List<CompletableFuture<List<TCaAwardInfo>>> futures = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
int startIndex = i * dataSizePerThread;
int endIndex = (i == threadNum - 1) ? awardIds.size() : (i + 1) * dataSizePerThread;
List<Long> subList = awardIds.subList(startIndex, endIndex);
CompletableFuture<List<TCaAwardInfo>> future = CompletableFuture.supplyAsync(() -> {
List<TCaAwardInfo> result = new ArrayList<>();
List<TCaAwardInfo> tCaAwardInfos = awardApiService.queryActivationCode(subList);
result.addAll(tCaAwardInfos);
return result;
}, taskExecutor);
futures.add(future);
}
List<TCaAwardInfo> activationCodeList = new ArrayList<>();
for (CompletableFuture<List<TCaAwardInfo>> future : futures) {
activationCodeList.addAll(future.join());
}
```