标签: java-stream

Stream.of(item).collect(Collectors.toSomeCollection())比新的SomeCollection(Arrays.asList(item))更快吗?

Java 8提供

Stream.of(item).collect(Collectors.toSomeCollection())
Run Code Online (Sandbox Code Playgroud)

例如Stream.of("abc").collect(Collectors.toSet()).避免相对昂贵的new操作员在窗帘前快速

new SomeCollection(Arrays.asList(item))
Run Code Online (Sandbox Code Playgroud)

例如new HashSet<>(Arrays.asList("abc"))?

我确信不同集合的初始化new具有不同的成本(哈希集在准备使用之前需要哈希表,数组列表是分配的数组,而链表不需要这样).

我试图弄清楚流相关类是否在new内部避免,但OpenJDK代码很难理解.我认为如果我将其Stream.of视为已初始化的管道和使用可重用功能的收集器,它们就可以了.

可能是反过来了吗?

java collections java-stream

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

如何在Java流中使用thenComparing

我有一个以字符串为值的地图。我想首先按长度排序,如果字符串的长度相同,我想按字母排序。我写了那些代码:

String out = outMap.values().stream()
                .sorted(Comparator.comparing(e -> e.length()).thenComparing()...)
                .collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)

问题是,当我写thenComparing时,我不能使用e.length()了。我该如何解决?

编辑:Map<Character, String>。我想对所有字符串进行排序,并在输出中连接一个字符串。

java comparator java-8 java-stream

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

在Java8中将Map &lt;String,String&gt;转换为List &lt;Object&gt;

我有返回的API,Map<String,String>需要将其转换为DTO。

 SubjectIdAndNameDTO (id, name constructor args)
           id
           name
Run Code Online (Sandbox Code Playgroud)

当前的实现使用传统的for循环和Map.EnterSet。我如何使用Java8的功能来简单地执行以下代码。

 Map<String, String> map = getSubjectIdAndNameMap();          

 // How can this code can be improved by using Java8 Stream and method references

 List<SubjectIdAndNameDTO> subIdNameDTOList = new ArrayList<>();

 for (Entry<String, String> keyset : map.entrySet()) {
        SubjectIdAndNameDTO subjectIdNameDTO = 
                 new SubjectIdAndNameDTO(keyset.getKey(), keyset.getValue());
        subIdNameDTOList.add(subjectIdNameDTO);
 }
Run Code Online (Sandbox Code Playgroud)

java-8 java-stream

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

将字符串列表拆分为地图列表

我有以下清单 [12_223,13_4356,15_5676]

我能够使用以下代码溢出下划线并将其转换为一个Hashmap

list.stream()
    .map(s -> s.split("_"))
    .collect(Collectors.toMap(
        a -> a[0],
        a -> a[1]));
Run Code Online (Sandbox Code Playgroud)

它给出了下面的地图 {"12"="223", "13"="4356", "15"="5676"}

但我想更改此代码,以便它给我一个像下面的地图列表,因为我可能会在分割时遇到重复的键

[{"12"="223"}, {"13"="4356"}, {"15"="5676"}]

java list java-8 java-stream

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

用于设置和保留订单的Java Stream Map List

我有一个Answer类和一个User类.

答案有一个getUser()和用户有一个getPoints()

从答案列表中我想得到一个按点排序的用户哈希集.我试过以下:

 Set<User> collectSet = list.stream().map(Answer::getUser)
            .sorted(Comparator.comparing(User::getPoints))
            .collect(Collectors.toCollection(HashSet::new));

 collectSet.forEach(a -> System.out.println(a.toString()));
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎没有保留顺序.输出总是不同的.

有趣的是,列表的相同示例可以正常工作

List<User> collectList = list.stream().map(Answer::getUser)
            .sorted(Comparator.comparing(User::getPoints))
            .collect(Collectors.toList());

collectList.forEach(a -> System.out.println(a.toString()));
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

java java-stream

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

如何使用Java Stream处理列表中的数据

如何使用Java Stream迭代List中的2个循环.

public class ArrayStreams {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(2);

for (int i = 0; i < list.size(); i++) {
            for (int j = i + 1; j < list.size(); j++) {
                System.out.println("i :" + list.get(i) + "J :" + list.get(j));
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

如何将此代码转换为Java Stream.请帮忙!

java java-8 java-stream

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

为什么这个Java流的一个版本在静态地图上工作而另一个版本失败?

我有一张静态地图:

private static final Map<SomeObject, AnotherObject> SOME_MAP = ...build map here...
Run Code Online (Sandbox Code Playgroud)

我正在尝试生成一个类型列表 List<AnotherObject>

这按预期工作:

List<AnotherObject> list = Stream.of(SOME_MAP.values())
  .flatMap(Collection::stream)
  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

由于非静态方法无法在静态上下文中引用,因此以下失败

List<AnotherObject> list = SOME_MAP.values().stream()
  .flatMap(Collection::stream)
  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

任何人都可以确切地解释第二个版本如何在第一个版本没有的情况下包含非静态方法错误?

这是一个具体的例子:

private static final Map<Integer, Integer> SOME_MAP = ImmutableMap.of(1, 2, 3, 4, 5, 6);

@Test
public void workingTest() {
 List<Integer> list = Stream.of(SOME_MAP.values())
    .flatMap(Collection::stream)
    .collect(Collectors.toList());

   System.out.println(list); // prints out [2, 4, 6]
}


@Test
public void nonWorkingTest() {
 List<Integer> list = SOME_MAP.values().stream()
    .flatMap(Collection::stream)
    .collect(Collectors.toList());

   System.out.println(list); // Fails before this.
}
Run Code Online (Sandbox Code Playgroud)

在失败的测试中,我收到以下错误:

Error:(79, …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

如何使用Java 8流将字符串数组转换为Big-integer数组

我有一个String数组,我想使用Java 8流将其转换为BigInteger数组。

String[] output = bigSorting(new String[]{"31415926535897932384626433832795", "1", "4900146572543628830293235422623540449026979", "10", "57500297590012603652986133599394871645776460", "5", 
                    "497010206818067722087306230802257700034825862515267073569769100385728461314", "57500297590012603652986133599394871645776460497010206818067722087306230802257700034825862515267073569769100385728461314497010206818067722087306230802257700034825862515267073569769100385728461314497010206818067722087306230802257700034825862515267073569769100385728461314497010206818067722087306230802257700034825862515267073569769100385728461314497010206818067722087306230802257700034825862515267073569769100385728461314"});
        Object[] unsortedBigIntegerArr = convertFromStringArrayToBigIntegerArray(output);
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的方法,但是我无法获取BigInteger数组,但是却能够获取Object数组。

private static Object[] convertFromStringArrayToBigIntegerArray(String[] unsorted) {
        return Arrays.stream(unsorted).map(BigSorting2::convertFromStringToBigInteger).toArray();
    }

    private static BigInteger convertFromStringToBigInteger(String unsorted) {
        return new BigInteger(unsorted);
    }
Run Code Online (Sandbox Code Playgroud)

有什么办法可以使用Java 8流完全完成它。

java biginteger java-8 java-stream

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

从无限流派生的已排序流无法迭代

import java.util.stream.*;
import java.util.*;

class TestInfiniteStream {
    public static void main(String args[]) {
        IntStream infiniteStream = new Random().ints();
        IntStream sortedStream = infiniteStream.sorted();

        sortedStream.forEach(i -> System.out.println(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

编译并执行此代码后,出现以下错误。

Exception in thread "main" java.lang.IllegalArgumentException: Stream size exceeds max array size
Run Code Online (Sandbox Code Playgroud)

在无限流上排序流是否失败?

java java-stream

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

通过Java 8 Streams API进行StringBuilder操作

我正在努力从StringBuilder中删除一些字符.该方法工作正常.但是,我希望通过Java-8流API实现相同的功能.目前的代码很冗长.有没有办法通过Java 8流API重构第二个方法removeCarryReturnsCharacters()?

private static StringBuilder readEntireFileUsingStream(Path filePath) throws IOException {

    StringBuilder data = new StringBuilder(String.valueOf(Files.readAllLines(filePath, StandardCharsets.ISO_8859_1)));

    return removeCarryReturnsCharacters(data);

}

private static StringBuilder removeCarryReturnsCharacters(StringBuilder fileData){

    int endIndex = 1012;
    String needToRemove = "";
    long totDataChunkCount = fileData.length()/1014;
    long delCounter = 1;
    try{
        while (delCounter < totDataChunkCount) {
            needToRemove = fileData.substring(endIndex, endIndex + 2);
            if (needToRemove.equals("^^")) {
                fileData.delete(endIndex, endIndex + 2);
            }
            endIndex += 1012;
            delCounter++;
        }
    }catch(StringIndexOutOfBoundsException exp){
        throw exp;
    }
    return fileData;
}
Run Code Online (Sandbox Code Playgroud)

stringbuilder java-8 java-stream

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