Questions tagged «java-8»

对于2014年3月18日发行的Java平台的第8版(内部版本1.8)特定于Java 8的问题,请使用此标记。在大多数情况下,您还应该指定java标记。

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中的每个元素。谁能解释这个。

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 …

2
尽管使用了WeakHashMap,但仍发生OutOfMemoryException
如果不调用System.gc(),系统将抛出OutOfMemoryException。我不知道为什么需要System.gc()显式呼叫;JVM应该gc()自称对吧?请指教。 以下是我的测试代码: public static void main(String[] args) throws InterruptedException { WeakHashMap<String, int[]> hm = new WeakHashMap<>(); int i = 0; while(true) { Thread.sleep(1000); i++; String key = new String(new Integer(i).toString()); System.out.println(String.format("add new element %d", i)); hm.put(key, new int[1024 * 10000]); key = null; //System.gc(); } } 如下所示,添加-XX:+PrintGCDetails以打印出GC信息;如您所见,实际上,JVM尝试执行完整的GC运行,但是失败;我仍然不知道原因。如果我取消注释该System.gc();行,结果是肯定的,这很奇怪: add new element …

1
removeIf实现细节
我有一个小的实施细节问题,我在中无法理解ArrayList::removeIf。我认为我不能简单地将它放在没有任何先决条件的情况下。 如此:实现基本是散装 remove,不像ArrayList::remove。一个例子应该使事情更容易理解。假设我有以下列表: List<Integer> list = new ArrayList<>(); // 2, 4, 6, 5, 5 list.add(2); list.add(4); list.add(6); list.add(5); list.add(5); 我想删除所有偶数元素。我可以做: Iterator<Integer> iter = list.iterator(); while (iter.hasNext()) { int elem = iter.next(); if (elem % 2 == 0) { iter.remove(); } } 或: list.removeIf(x -> x % 2 == 0); 结果将是相同的,但是实现是非常不同的。由于iterator是的视图,因此ArrayList每次调用时remove,ArrayList都必须将基础层置于“良好”状态,这意味着内部数组实际上会发生变化。同样,每次调用时remove,都会在System::arrayCopy内部进行调用。 …
9 java  java-8  iterator 

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; } …

1
用反射打破JIT优化
当为高度并发的单例类研究单元测试时,我偶然发现了以下奇怪的行为(在JDK 1.8.0_162上进行了测试): private static class SingletonClass { static final SingletonClass INSTANCE = new SingletonClass(0); final int value; static SingletonClass getInstance() { return INSTANCE; } SingletonClass(int value) { this.value = value; } } public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { System.out.println(SingletonClass.getInstance().value); // 0 // Change the instance to a …

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 …

2
java.net.SocketException:Spring Rest模板中的连接重置
我这里有一个奇怪的问题。 在我重新启动客户端的tomcat服务器之前,以下代码可以正常工作。一旦我使用相同代码的最新war文件重启tomcat服务器(war文件中存在客户端程序),它将引发以下错误。我正在使用JDK 8。 下面是示例代码。从浏览器中,我可以从以下程序中使用的URL获得响应。但也无法使用Java程序或Postman获取数据。 package com.example.demo; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component public class TestService implements CommandLineRunner{ @Override public void run(String... args) throws Exception { download(); } private void download() { System.out.println("Started download"); try{ RestTemplate restTemplate = new RestTemplate(); String url = "https://www.nseindia.com/live_market/dynaContent/live_watch/stock_watch/niftyStockWatch.json"; byte[] forObject = restTemplate.getForObject(url, byte [].class); …

6
在POJO中复制公共属性的获取者/设置者的方法
我们有一个自动生成的POJO,具有约60个属性。这是通过avro 1.4生成的,其中不包括getter / setter。 我们用来在对象之间提供简单转换的库需要使用类似于getter / setter的方法才能正常工作。 有没有一种方法可以复制获取器/设置器,而不必手动覆盖POJO并手动创建所有获取器/设置器? public class BigGeneratedPojo { public String firstField; public int secondField; ... public ComplexObject nthField; } public class OtherObject { private String reprOfFirstFieldFromOtherObject; private ComplexObject reprOfFirstFieldFromOtherObject; public String getReprOfFirstFieldFromOtherObject() { ... standard impl ... }; public void setReprOfFirstFieldFromOtherObject() { ... standard impl ... …

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.