标签: java-stream

将原始流收集到类型化集合中?

我正在调用一个返回 raw 的库方法Stream。我知道流中元素的类型,并希望将其收集到具有声明元素类型的集合中。什么是好的或不那么骇人听闻的做法?

最小的可重复示例

为了一个可重现的例子,假设我想调用这个方法:

@SuppressWarnings("rawtypes")
static Stream getStream() {
    return Stream.of("Example");
}
Run Code Online (Sandbox Code Playgroud)

我曾希望这会起作用,但我不明白为什么它不起作用:

    List<String> stringList = getStream().map(s -> (String) s).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我得到Type mismatch: cannot convert from Object to List。为什么?

解决方法

未经检查的演员阵容有效。为了缩小需要标记为故意未检查的位,我们可以这样做

    @SuppressWarnings("unchecked")
    Stream<String> stringStream = getStream();
    List<String> stringList = stringStream.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

在 Java 8 和 Java 11 上,返回的列表都是 a java.util.ArrayList,它包含预期的String元素。

我的搜索结果出现与否

我尝试使用我的搜索引擎搜索诸如java collect raw stream 之类的术语。它没有让我找到任何有用的东西。有一个封闭的 Java 错误(底部的链接)提到一旦您对原始类型进行操作,一切都会变得原始。但是这个完全原始的版本也不起作用:

    List stringList = getStream().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我仍然遇到Type mismatch: cannot convert from Object to List。怎么来的? …

java raw-types generic-collections type-parameter java-stream

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

按整数列表中的最小值对 Map 键进行排序

我正在尝试HashMap按如下方式对 a 进行排序

HashMap<String, List<obj> a = new hashmap<>();

a.put('a',{8,10,9});
a.put('b',{6,9,1});
Run Code Online (Sandbox Code Playgroud)

排序输出就像

{ ('b',{1,6,9}) , ('a',{8,9,10}) }
Run Code Online (Sandbox Code Playgroud)

分选条件:

  1. 对每个键中的值进行排序
  2. 根据最小值对键进行排序。

java sorting hashmap java-stream

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

Java 中的 C# .Take()

我是一名 C# 开发人员,最近开始进入 Java 开发,在这里我有一个问题。Java 是否有任何内置方法可以用 C# 做同样的事情.Take()?

C# 示例:

int diffNo = 1;
someNumber.OrderBy(x => x.someNumber).Take(diffNo).ToList();
Run Code Online (Sandbox Code Playgroud)

Java示例:

someNumber.stream().sorted(Comparator.comparing(Object::getSomeNumber)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

所以现在对于Java部分我只能进行排序但不知道是否有方法可以用来替换 .Take()

c# java java-stream

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

Java - 使用 .stream 在 List&lt;&gt; 中查找

我正在尝试使用 .stream 运算符在 List<> 中查找对象,但出现语法错误我无法解决尽管遵循我在网上找到的示例...希望有人可以帮助解决我不理解的任何问题.

我将以下内容设置为要存储在 List<> 中的对象:

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class JelCodeMapping {
    private String jelCodeId;
    private String jelCodeName;
    private int network1;
    private int network2;
    private int network3;
}
Run Code Online (Sandbox Code Playgroud)

然后实例化一个列表(它在其他地方填充)

private List<JelCodeMapping> jelCodeMappings;
Run Code Online (Sandbox Code Playgroud)

然后我想在列表中搜索一个包含特定值的对象:

    private List<Integer> getNetworksForJelCode(String jelCode) {
        JelCodeMapping jelCodeMaping = jelCodeMappings.stream().filter(mapping -> mapping.getJelCodeId().equals(jelCode));

        List<Integer> jelCodeNetworks = new ArrayList<>();

//  other stuff happens here

        return jelCodeNetworks;
    }
Run Code Online (Sandbox Code Playgroud)

但我使用 .stream() 运算符的行生成以下语法错误消息:

Incompatible Types
Required: <packagePath>.JelCodeMapping
Found: java.util.stream.Stream   <packagePath>.jelCodeMapping
Run Code Online (Sandbox Code Playgroud)

我相当确定我正在遵循我发现的示例,但无法解决问题。我不明白什么?

感谢您的任何想法/见解

java java-stream

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

List&lt;String&gt; 到 Map&lt;String,String&gt; 与流,字符串拆分

我有字符串列表:

List<String> cookiesUpdate = Arrays.asList("A=2" , "B=3");
    
Run Code Online (Sandbox Code Playgroud)

我想将其转换为地图:

{
  "A": "2",
  "B": "3"
}
Run Code Online (Sandbox Code Playgroud)

代码:

Map<String, String> cookies = cookiesUpdate.stream()
     .collect(Collectors.toMap(String::toString, String::toString));
Run Code Online (Sandbox Code Playgroud)

上面的那些分隔符怎么写?如果编译器认为关键字符串是对象。

.split("=")[0];
.split("=")[1];
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

Java BinaryOperator 和工厂方法。如何返回第一个参数?

我试图通过下一个代码将我的流转换为映射:

Collectors.toMap(City::key, Function.identity(), (first, second) -> first)
Run Code Online (Sandbox Code Playgroud)

我关于最后一个 lambda 的问题。

(first, second) -> first
Run Code Online (Sandbox Code Playgroud)

如果发生碰撞,我经常需要获取任何元素或始终获取第一个元素。我明白,这已经是简短而清晰的形式。但是还是。对于Function类,我们有工厂方法Function.identity(),它按原样返回传递的参数。我们有 forBiFunction或 for的工厂方法BinaryOperator吗?或者可能是接近Function.identity(). 我也知道BinaryOperator.minBy()和BinaryOperator.maxBy(),但他们更“详细”,而不是比如此清晰的方法Function.identity()。

java collections lambda java-8 java-stream

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

Java8 过滤器数组列表与字段日期上的自定义对象

我必须List<Card>在字段issueDate(类型String)上进行过滤,其中卡片要显示到过去 7 年的日期。

我尝试过的解决方案是issueDate从Stringto解析字段Date,然后应用date.after(startDate),date.before(endDate)如下所示:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cardList.stream()
        .map(s->s.getIssueDate())
        .filter(dt -> sdf.parse(dt).after(sdf.parse("2020-06-08")) && 
                      sdf.parse(dt).before(sdf.parse("2020-08-12")))
        .collect(Collectors.toList());  
Run Code Online (Sandbox Code Playgroud)

甚至不能申请循环,因为可能有数百张卡发行,它通过迭代每个发卡日期(字符串到日期和检查年份)来影响性能

任何人都可以提出一个很好的解决方案来解决这个问题吗?

arraylist simpledateformat java-8 java-stream java-time

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

Stream.empty 的实际用途是什么?

Stream#empty返回一个空的序列Stream。从本教程中,我了解到空流可能有助于在调用带有流参数的方法时避免空指针异常。但是,我想不出一个例子可以帮助我清楚地理解这个陈述。

java java-8 java-stream

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

Java Stream 生成的值多于限制集

出于某种原因,Java Stream 会生成更多的值(调用迭代器的 hasNext() 和 next() 方法。

这是合成示例。

我有一个迭代器形式的生成器:

@RequiredArgsConstructor
static class TestIterator implements Iterator<Integer> {
    private final int bound;
    private final Random rnd = new Random();

    private int current = 0;

    @Override public boolean hasNext() {
        return current < bound;
    }

    @Override public Integer next() {
        current = rnd.nextInt(20);
        System.out.println("Generated: " + current);
        return current;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试创建一个由几个迭代器组成的扁平流

public static void main(String... args) {

    List<Iterator<Integer>> iterators = asList(
        new TestIterator(18),
        new TestIterator(18),
        new TestIterator(18));
    Stream<Integer> streams = iterators.stream()
        .map(iter …
Run Code Online (Sandbox Code Playgroud)

java iterator java-stream

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

检查地图的所有值是否为真

我有一个Map<String, Boolean> map = new HashMap<>();。
考虑其中有五个键。

map.put("A", true);
map.put("B", true);
map.put("C", false);
map.put("D", true);
map.put("E", true);
Run Code Online (Sandbox Code Playgroud)

如果上面地图中的所有值都为真,我需要将一个布尔标志设置为真。
如果任何值是假那么我需要将布尔标志设置为假

我可以迭代这张地图并像旧的方式一样做,但我想知道如何通过在这张地图上流式传输在一行中做到这一点。

java hashmap java-8 java-stream

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