标签: java-8

Java 8:如何将for循环转换为并行运行?

for (int i=0; i<100000; i++) {
    // REST API request. 
restTemplate.exchange(url, HttpMethod.GET, request, String.class);
}
Run Code Online (Sandbox Code Playgroud)

我有一种情况,我必须为10万用户请求一个资源,它需要70分钟才能完成.我试图尽可能地清理我的代码,我只能将它减少4分钟).

由于每个请求彼此独立,我很乐意并行发送请求(可能是10s,100s甚至1000s的块,每次快速完成).我希望我能把时间减少到10分钟或者接近的时间.如何计算哪个块大小可以快速完成工作?

我找到了以下方法,但我不知道该程序是否一次处理所有20个; 或一次5个; 或者一次10个.

IntStream.range(0,20).parallel().forEach(i->{
     ... do something here
});
Run Code Online (Sandbox Code Playgroud)

我知道你的帮助.我对任何建议或评论都持开放态度!

更新:我能够使用IntStream,并在28分钟内完成任务.但我不确定这是我能做的最好的.

java parallel-processing concurrency java.util.concurrent java-8

2
推荐指数
1
解决办法
6346
查看次数

Java 8:惯用于创建Comparator,用于根据List中的索引对对象进行排序

什么是创造了最地道的方式Comparator<T>在Java中8定义对象的排序例如,基于在其相对指标给定的List,但仍然是一个对象在该列表中不存在定义为"后"那些是列表中?- 如果我只是使用List.indexOf(Object),不在列表中的对象将总是在列表中的对象之前,因为-1对于不在列表中的所有对象返回的事实,这小于任何"真"索引:

    final List<String> ordering = Arrays.asList("foo", "bar");
    final Comparator<String> orderingComparator = Comparator.comparingInt(ordering::indexOf);
    final String str1 = "foo";
    final String str2 = "baz";
    final String msg;
    final int cmp = orderingComparator.compare(str1, str2);
    if (cmp < 0) {
        msg = String.format("Element \"%s\" is ordered before \"%s\".", str1, str2);
    } else if (cmp > 0) {
        msg = String.format("Element \"%s\" is ordered after \"%s\".", str1, str2);
    } else {
        msg …
Run Code Online (Sandbox Code Playgroud)

java list comparator java-8

2
推荐指数
1
解决办法
868
查看次数

Java 8 Streams统计所有键

我有一个文件,其中包含JSON格式的数据.我正在逐行阅读它,每行都有1个JSON记录,所以格式确实不是问题.以下是一个示例行:

{"url": "http://ldrlongdistancerider.com/bikers_rights_motorcycle/rightsriders0163.php", "timestamp": 1257072412, "tags": ["nscensorship", "cloudmark", "network", "solutions", "content", "based", "spam", "signatures"]}
Run Code Online (Sandbox Code Playgroud)

我需要做的是计算所有重复的URL并将其打印为:

 http://ldrlongdistancerider.com/bikers_rights_motorcycle/rightsriders0163.php"  1
Run Code Online (Sandbox Code Playgroud)

如何使用流来实现这一目标?顺便说一下,我需要根据时间戳过滤记录.因此,如果有人通过了一系列日期,我将不得不计算落在该范围内的网址.我已经完成了大部分工作,但这个计算部分对我来说很困惑.

这是我到目前为止所做的:

for (Path filePath : files) {
        try {
            Files.lines(Paths.get(filePath.toUri()))
                 .filter(s -> Link.parse(s).timestamp() > startSeconds)
                 .filter(s -> Link.parse(s).timestamp() < stopSeconds)
                 .forEach(s -> countMap.put(Link.parse(s).url(), 1));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

countMap是String,Integer的HashMap

java lambda java-8 java-stream

2
推荐指数
1
解决办法
1069
查看次数

HashMap在jdk8中调整大小

我在jdk8中找到了HashMap函数resize()的源代码:

final Node<K,V>[] resize() {
    Node<K,V>[] oldTab = table;
    int oldCap = (oldTab == null) ? 0 : oldTab.length;
    int oldThr = threshold;
    int newCap, newThr = 0;
    if (oldCap > 0) {
        if (oldCap >= MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return oldTab;
        }
        else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
                 oldCap >= DEFAULT_INITIAL_CAPACITY)
            newThr = oldThr << 1; // double threshold
    }
    else if (oldThr > 0) // initial capacity was placed in threshold
        newCap = …
Run Code Online (Sandbox Code Playgroud)

java resize hashmap java-8

2
推荐指数
1
解决办法
218
查看次数

Java 8中的Lambda Expression是否缩短了执行时间?

我是Java 8的新手,对Lambda Expression的范围感到有点困惑.我读了一些文章表示Lambda Expression减少了执行时间,所以要找到我写的两个程序之后的相同内容

1)不使用Lambda Expression

import java.util.*;

public class testing_without_lambda
{
  public static void main(String args[])
  {
    long startTime =  System.currentTimeMillis();       
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    for (int number : numbers) 
    {
        System.out.println(number); 
    }   
    long stopTime =  System.currentTimeMillis();
    System.out.print("without lambda:");
    System.out.println(stopTime - startTime);
  }//end main
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

2)使用Lambda Expression

import java.util.*;
public class testing_with_lambda
{
  public static void main(String args[])
  {  
    long startTime =  System.currentTimeMillis();
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);    
    numbers.forEach((Integer …
Run Code Online (Sandbox Code Playgroud)

java-8

2
推荐指数
1
解决办法
255
查看次数

重构Java 8流代码

我使用Java 8实现了以下代码.

Map<String, String> coMap = getHashMap();

String newCoName = coMap.entrySet()
                     .stream()
                     .filter(coEntry -> coEntry.getValue().equals(newcoId))
                     .map(coEntry -> coEntry.getKey())
                     .collect(Collectors.joining());


String oldCoName = coMap.entrySet()
                     .stream()
                     .filter(coEntry -> coEntry.getValue().equals(oldcoId))
                     .map(coEntry -> coEntry.getKey())
                     .collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)

现在.我想知道更好的方法,而不是重复相同的代码行两次.

java java-8 java-stream

2
推荐指数
2
解决办法
1361
查看次数

Java 8可选如何定义NullPointerException的错误消息

在Java 8之前,我们通常必须执行以下操作才能快速执行Null值.

Objects.requireNonNull(pointer, "Your Error Message");
Run Code Online (Sandbox Code Playgroud)

根据Java 8 Documentation,如果传递的参数为null ,Optional.of则抛出NullPointerException.

// Optional.of - throws NullPointerException if passed parameter is null
Optional<Integer> b = Optional.of(value2);
Run Code Online (Sandbox Code Playgroud)

有没有什么办法来定义错误消息NullPointerException在Java中8 Optional

java nullpointerexception optional java-8

2
推荐指数
2
解决办法
800
查看次数

如何在java 8流中进行条件操作以跳过下一个流操作?

在传统方式中,我已经编写了这个简单的java for循环

public String setString(String string) {  
StringBuilder stringBuilder = new StringBuilder();

    // This for loop I want to convert into stream. 
    for (char c : string.toCharArray()) {
       if (Character.isSpaceChar(c))
           stringBuilder.append(c);
       else if (isBangla(c))
           stringBuilder.append(get(c));
    }
    return stringBuilder.toString();
}

String get(int c) {
    return keyMap.getMap((char) c); // Map<Character, String> keyMap
}

boolean isBangla(int codePoint) {
    return ((codePoint >= BANGLA_CHAR_START && codePoint <= BANGLA_CHAR_END) &&
        (codePoint <= BANGLA_NUMBER_START || codePoint >= BANGLA_NUMBER_END)));
}
Run Code Online (Sandbox Code Playgroud)

我试过这样的事情.

String str = string.chars()
            .filter(i -> Character.isSpaceChar(i)) …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

2
推荐指数
1
解决办法
2827
查看次数

使用java 8流在已排序的数字列表中查找最长的连续数字

我有一段使用传统for循环编写的代码,如下所示.我想重构它以使用java 8流并删除for循环.以下代码的输出应为3,因为这是最长的连续数字列表(4,5和6)

    List<Integer> weekDays = Lists.newArrayList(1, 2, 4, 5, 6);

    List<Integer> consecutiveIntervals = Lists.newArrayList();
    int maxConsecutiveTillNow = 1;
    for (int i = 1; i < weekDays.size(); i++) {
        if (weekDays.get(i) - weekDays.get(i - 1) == 1) {
            maxConsecutiveTillNow++;
        } else {
            consecutiveIntervals.add(maxConsecutiveTillNow);
            maxConsecutiveTillNow = 1;
        }
    }
    consecutiveIntervals.add(maxConsecutiveTillNow);

    System.out.println(consecutiveIntervals.stream()
                                           .max(Integer::compareTo)
                                           .get()
                      );
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

2
推荐指数
1
解决办法
945
查看次数

if-elseif-else类似的Java 8流功能

我有一个对象列表,可以说形状。我想使用流来处理它们,并根据列表中的内容返回另一个对象-ShapeType。

通常,我只返回ShapeType.GENERIC,但是如果其中存在Rectangle,我想返回ShapeType.RECT。如果列表中有一个六角形,我想返回ShapeType.HEXA。当同时存在矩形和正方形时,我想返回ShapeType.HEXA。

现在,当涉及到代码时,我想要这样的东西:

  public ShapeType resolveShapeType(final List<Shape> shapes) {
    shapes.stream()
    .filter(shape -> shape.getSideCount() == 6 || shape.getSideCount() == 4)
    // I should have a stream with just rectangles and hexagons if present.
    // what now?
  }
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

2
推荐指数
1
解决办法
5432
查看次数