标签: java-stream

使用 java 8 流 api 对 json 数组进行排序

我一直在尝试使用 Java 8 的 Stream api 对 JSONArray 进行排序。但是我想我无法正确完成类型转换。

我所能得到的就是下面的代码。

String objects = "[\n" +
                    "  {\n" +
                    "    \"lat\": \"-16.408545\",\n" +
                    "    \"lon\": \"-71.539105\",\n" +
                    "    \"type\": \"0\",\n" +
                    "    \"distance\": \"0.54\"\n" +
                    "  },\n" +
                    "  {\n" +
                    "    \"lat\": \"-16.4244317845\",\n" +
                    "    \"lon\": \"-71.52562186\",\n" +
                    "    \"type\": \"1\",\n" +
                    "    \"distance\": \"1.87\"\n" +
                    "  },\n" +
                    "  {\n" +
                    "    \"lat\": \"-16.4244317845\",\n" +
                    "    \"lon\": \"-71.52562186\",\n" +
                    "    \"type\": \"1\",\n" +
                    "    \"distance\": \"0.22\"\n" +
                    "  }\n" …
Run Code Online (Sandbox Code Playgroud)

java json java-stream

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

将 system.out.print 与 java 流一起使用

我有下面的代码将每个条目映射到打印语句,但它显示错误。
我理解的方式有问题吗Stream().map()?

如何System.out.println()在 Streams API 中使用?我该如何更正以下代码?

public static void main(String[] args) {

    Properties p = new Properties();
    p.setProperty("name", "XYX");
    p.setProperty("email", "xyx@mail.com");
    p.setProperty("address", "addr-street-city");

    p.entrySet().stream().map(e ->
            System.out.println(" " + e.getKey().toString() + " " + e.getValue().toString() + ""));
}
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

使并行 IntStream 更高效/更快?

我已经寻找这个答案一段时间了,但找不到任何东西。

我正在尝试创建一个 IntStream ,它可以非常快速地找到素数(很多很多素数,非常快——几秒钟内数百万个)。

我目前正在使用这个并行流:

import java.util.stream.*;
import java.math.BigInteger;

public class Primes {
    public static IntStream stream() {
        return IntStream.iterate( 3, i -> i + 2 ).parallel()
                .filter( i -> i % 3 != 0 ).mapToObj( BigInteger::valueOf )
                .filter( i -> i.isProbablePrime( 1 ) == true )
                .flatMapToInt( i -> IntStream.of( i.intValue() ) );
    }
}
Run Code Online (Sandbox Code Playgroud)

但生成数字需要很长时间。(生成 1,000,000 个素数需要 7546 毫秒)。

有没有任何明显的方法可以使其更高效/更快?

java parallel-processing primes java-stream

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

如何按长字段对 List<Object> 进行排序

List<DetailsDescription> result = new ArrayList<>();
result.add(
     new DetailsDescription(((Date) row.getObject("alarm_start_timestamp")).getTime()));

result.stream().sorted(Comparator.comparing(DetailsDescription::getStartTimestamp)
               .reversed())
               .limit(PAGE_SIZE)
               .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

大家好!

我的列表中有几行,并且有我想排序的时间戳。问题是比较器需要一个 int 并且我不能强制转换 long (即日期),因为如果我这样做,我会削减一些最后的数字。代码可以工作,但排序不准确(它删除了最后一位数字)。

它可能会帮助您理解:

result.stream().sorted((a,b)->a.getStartTimestamp() - b.getStartTimestamp()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

和错误:

Type mismatch: cannot convert from long to int
Run Code Online (Sandbox Code Playgroud)

java sorting arraylist java-stream

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

Java映射/收集流以求和列表列表

我正在使用 Java 8 以及包中的 Map、Reduce、Collect API java.util.stream。我有一个用例,我需要对列表的列表进行垂直求和。我的列表的结构是List<List<Integer>> 我想不出一种方法可以使用映射压缩内部列表,并减少或收集流上可用的操作。考虑以下代码。假设我的列表名为transactions. 此交易存储的是内部列表中每个商品的每笔交易中售出的商品数量。内部清单的长度对于所有交易都是相同的,因为它包含库存中每一项的一个条目。如果该项目未参与交易,则仅存储 0。

我在想一些关于

transaction.stream().map(
      /*Try and put sum into an accumulator List*/
).collect(
      /*Collect entries into a list*/
)
Run Code Online (Sandbox Code Playgroud)

我只是不知道如何在代码中实现这一点。网络上的所有资源都是简单的示例,不适用于集合对象。任何指示/提示将不胜感激。

java java-stream

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

Java 8流从List中的Map读取值

我不想使用 foreach 和循环。我想使用 Java 8 中的流来查找 List 内的 Map 中的值

List<Map<String, Boolean>> types = ...

map.stream().filter(...
Run Code Online (Sandbox Code Playgroud)

问题是在过滤器中我无法按键/值对进行搜索。

我想获取 boolean = true 的所有元素

我做错了什么吗?

java java-stream

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

使用java 8流转换为大写字母

我有一个像“出租车或公交车司机”这样的字符串列表。我需要将每个单词的第一个字母转换为大写字母,除了单词“or”。有没有简单的方法可以使用Java流来实现这一点。我尝试过使用 Pattern.compile.splitasstream 技术,我无法将所有分割的标记连接回形成原始字符串,任何帮助将不胜感激。如果任何机构需要我可以在此处发布我的代码。

java java-8 java-stream

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

如何在java 8中使用收集器和流自动递增哈希图的键

我是 Java 8 Streams和Collectors类的新手。

我正在读取一个文件,其内容需要保存在一个文件中LinkedHashMap<Integer, String>,其中它<keys>是文件的行号,它<values>是每行的内容。

在这里,我想使用这个Stream概念,但我无法使用Collectors.toMap自动递增<keys>,它需要保存在LinnkedHashMap对象中。相反,我得到了例外。

以下是我正在尝试的代码:

List<String> list = new ArrayList<>();
Integer count = 0;

try (BufferedReader br = Files.newBufferedReader( Paths.get( fileName ) )) {
    // br returns as stream and convert it into a List
    list = br.lines().collect( Collectors.toList() );
}
catch ( IOException e ) {
    e.printStackTrace();
}

list.forEach( System.out::println );

Map<Integer, String> fileNumWithContentMapper = list.stream()
        .collect( Collectors.toMap( n->n+1,s1->s1));
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream collectors

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

将 Java Stream 映射到以对象为键的对象映射

我有一些课程,并且正在 List<WorkDay> 中做一些工作,其中包含一个 List<LedgerItem>,除了一部分之外,我一切正常。嗯,它有效,但不完全是我想要的。

public Stream<Map<WorkDay, Set<LedgerItem>>> adjustWorkDays(List<WorkDay> workDays) {        
    return workDays.stream()
            .sorted((d1,d2) -> d1.getCreated().compareTo(d2.getCreated()))
            .map(day -> createGroupByWorkDay(day))/*need it to collect here*/;
}
Run Code Online (Sandbox Code Playgroud)

如果您可以看到返回类型是,Stream<Map<WorkDay, Set<LedgerItem>>>但我想将其映射到流之外,就像Map<WorkDay, Set<LedgerItem>>使用收集器一样,但似乎无法获取Collectors.toMap()语法来执行除中断之外的任何操作。

就像我说的,一切都很完美,所以我不需要映射之外的任何东西来工作。

仅供参考:已经createGroupByWorkDay返回Map<WorkDay, Set<LedgerItem>>,但只接受一个,WorkDay因为这是一个要求,所以我无法更改其执行方式......

提前致谢

编辑:所以我所拥有的未在此处列出的方法createGroupByWorkDay可以按预期完美运行,并且永远不会改变。它返回正确的类型,Map<WorkDay, Set<LedgerItem>>但只有一个 WorkDay 的签名,就像createGroupByWorkDay(WorkDay day)原始评论中的问题方法一样,使用该方法来构建按 WorkDay 分组并返回的单个地图,但可能有 N 个这样的地图,因此方法public Stream<Map<WorkDay, Set<LedgerItem>>> adjustWorkDays(List<WorkDay> workDays)应该返回收集到收集器中的一张地图中的所有地图。如果那有意义的话?

java-8 java-stream collectors

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

如何在java 8中初始化二维数组

在 Java 8 版本之前,我们可以使用 for 循环初始化二维数组,如下所示。如何在 JDK 1.8 中使用 lambda 表达式执行以下操作?

int[][] board = new int[3][3];
int v = 1;
for (int i = 0; i < board.length; i++) {

    for (int j = 0; j < 3; j++) {

        board[i][j] = v;
        v++;
        System.out.println(v);
    }
}
System.out.println(Arrays.deepToString(board));
Run Code Online (Sandbox Code Playgroud)

基本上,我正在寻找如下所示的数组

[[1,6],[2,7],[3,8],[4,9]]
Run Code Online (Sandbox Code Playgroud)

java arrays java-8 java-stream

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