Questions tagged «java-stream»

将此标签用于与使用Stream API有关的问题。它是Java 8中引入的,支持对值流的功能样式操作,例如集合上的filter-map-reduce管道。

3
自定义排序方式是A排在a之前,B排在b之前
我有一个这样的颜色列表: 粉色,蓝色,红色,蓝色,灰色,绿色,紫色,黑色...等 List<String> listOfColors = Arrays.asList("Pink", "Blue", "Red", "blue", "Grey", "green", "purple", "black"); 有一些中间操作,例如过滤一些水果色,现在剩下过滤结果要按顺序排序了: 蓝色,黑色,蓝色,灰色,绿色,粉红色,紫色,红色 我努力了 : List<String> collect = listOfColors.stream().sorted(String::compareToIgnoreCase) .collect(Collectors.toList()); 它不能按预期方式工作。 输出如下: 黑色,蓝色,蓝色,绿色,灰色,粉红色,紫色,红色 我想要以下内容: 蓝色,黑色,蓝色,灰色,绿色,粉红色,紫色,红色

2
清理Java8中的数据列表
为了清理数据列表,我创建了一种方法,该方法接受数据列表和要执行的清理操作列表。 public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) { List<T>dataNew=data.stream().map((str) -> { T cleanData = str; for(Function<T,T> function:cleanOps) { cleanData=function.apply(cleanData); } return cleanData; }).collect(Collectors.toList()); return dataNew; } 这里的问题是,当Collectors.toList()返回新列表时,我们将再次创建整个列表。我们可以在不使用额外空间的情况下达到相同的结果吗? 下面是调用代码: public void processData() { List<Function<String, String>> cleanOps = new ArrayList<>(); cleanOps.add(String::toLowerCase); cleanOps.add(str -> str.replaceAll(" ", "")); List<String> data = new …

4
peek()和allMatch()如何在Java 8 Stream API中一起工作
我发现了一个关于peek方法的Java 8 Stream API的测验,如下所示 Arrays.asList("Fred", "Jim", "Sheila") .stream() .peek(System.out::println) .allMatch(s -> s.startsWith("F")); 输出是 Fred Jim 我对此流的工作方式感到困惑吗?我的预期结果应该是 Fred Jim Sheila peek()方法是一个中间操作,它处理Stream中的每个元素。谁能解释这个。

8
有条件地从流中删除第一个(索引为零)元素
我有以下代码: Stream<String> lines = reader.lines(); 如果第一个字符串等于"email"我要从流中删除第一个字符串。对于流中的其他字符串,我不需要此检查。 我怎么能做到? 聚苯乙烯 当然,我可以将其转换为列表,然后使用旧式进行循环,但是进一步,我需要再次播放流。

6
如何在Java中从给定的地图值中查找最新日期
我有下面的值的哈希映射,在值中我已经日期为字符串数据类型。我想比较地图中所有可用的日期,并仅提取一个具有最近日期的键值。 我想与值而不是键进行比较。 我已包含以下代码 import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("1", "1999-01-01"); map.put("2", "2013-10-11"); map.put("3", "2011-02-20"); map.put("4", "2014-09-09"); map.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v)); } } 预期的输出是: 关键4值2014-09-09

4
使用流处理异常
我有一个,Map<String,List<String>>并希望将其变成,Map<String,List<Long>>因为String列表中的每个代表一个Long: Map<String,List<String>> input = ...; Map<String,List<Long>> output= input.entrySet() .stream() .collect(toMap(Entry::getKey, e -> e.getValue().stream() .map(Long::valueOf) .collect(toList())) ); 我主要的问题是每个人String可能不能正确代表一个Long; 可能有一些问题。Long::valueOf可能会引发例外情况。如果是这种情况,我想返回一个null或空Map<String,List<Long>> 因为我想遍历这张output地图。但是我不能接受任何错误转换。甚至没有一个。关于如何在不正确的String-> Long转换的情况下如何返回空输出的任何想法?

4
迭代和复制HashMap值的有效方法
我要转换: Map<String, Map<String, List<Map<String, String>>>> inputMap 至: Map<String, Map<String, CustomObject>> customMap inputMap在配置中提供并准备就绪,但我需要customMap格式化。CustomObject将派生自List<Map<String, String>>在函数中使用几行代码。 我尝试了一种迭代输入映射并在customMap中复制键值的常规方法。使用Java 8或其他快捷方式有什么有效的方法吗? Map<String, Map<String, List<Map<String, String>>>> configuredMap = new HashMap<>(); Map<String, Map<String, CustomObj>> finalMap = new HashMap<>(); for (Map.Entry<String, Map<String, List<Map<String, String>>>> attributeEntry : configuredMap.entrySet()) { Map<String, CustomObj> innerMap = new HashMap<>(); for (Map.Entry<String, List<Map<String, String>>> valueEntry …

3
Java Stream:过滤多个范围
我正在尝试过滤资源并基于字段排除一些元素。要排除,我有一个集合(其中包含一个需要排除的ID)和一个列表(其中包含多个范围的需要排除的ID)。我写了下面的逻辑,但对第二个过滤器逻辑不满意。有没有更好的方法可以用Java 8做到这一点?对于包含范围,我也需要这样做。 Set<String> extensionsToExclude = new HashSet<>(Arrays.asList("20","25","60","900")); List<String> rangesToExclude = new ArrayList<>(Arrays.asList("1-10","20-25","50-70","1000-1000000")); return directoryRecords.stream() .filter((directoryRecord) -> !extensionsToExclude.contains(directoryRecord.getExtensionNumber())) .filter((directoryRecord -> { Boolean include = true; for(String s : rangesToExclude) { String [] rangeArray = s.split("-"); Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber()); if(extension <= Integer.parseInt(rangeArray[0]) && extension >= Integer.parseInt(rangeArray[1])) { include = false; } …

4
使用Java流从员工列表中获取在特定加入日期之前和之后的员工
我List的Employees的不同加入日期。我想在使用流从List加入特定日期之前和之后获取员工。 我尝试下面的代码, List<Employee> employeeListAfter = employeeList.stream() .filter(e -> e.joiningDate.isAfter(specificDate)) .collect(Collectors.toList()); List<Employee> employeeListBefore = employeeList.stream() .filter(e -> e.joiningDate.isBefore(specificDate)) .collect(Collectors.toList()); class Employee{ int id; String name; LocalDate joiningDate; } 有没有办法在单个流中做到这一点?

5
如何为每个请求项创建多个线程
我正在尝试在订单级别使用多线程处理以下代码。 List<String> orders = Arrays.asList("order1", "order2", "order3", "order4", "order1"); 当前顺序执行: orders.stream().forEach(order -> { rules.forEach(rule -> { finalList.add(beanMapper.getBean(rule) .applyRule(createTemplate.apply(getMetaData.apply(rule), command), order)); }); }); 我尝试使用: orders.parallelStream().forEach(order -> {}} // code snippet. 但是它正在更改rules.forEach(rule-> {}}的顺序。 例如: 输入: List<String> orders = Arrays.asList("order1", "order2", "order3", "order4", "order1"); List<String> rules = Arrays.asList("rule1", "rule2", "rule3"); 预期产量: order1 with …

3
如何逐行复制大数据文件?
我有一个35GB的CSV文件。我想读取每一行,如果符合条件,则将该行写到新的CSV中。 try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("source.csv"))) { try (BufferedReader br = Files.newBufferedReader(Paths.get("target.csv"))) { br.lines().parallel() .filter(line -> StringUtils.isNotBlank(line)) //bit more complex in real world .forEach(line -> { writer.write(line + "\n"); }); } } 这大约需要。7分钟 是否可以进一步加快该过程?

3
如果使用Java 8 Streams列表为空,则返回默认列表?
有什么办法可以将以下操作作为一组流操作执行,而不是显式检查RecommendationProducts 是否为空,然后返回默认列表,否则返回过滤后的列表? public List<Product> getRecommendedProducts() { List<Product> recommendedProducts = this.newProducts .stream() .filter(isAvailable) .collect(Collectors.toList()); if (recommendedProducts.isEmpty()) { return DEFAULT_PRODUCTS; } return recommededProducts; }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.