标签: java-stream

具有多个参数的Java 8 Consumer在哪里?

例如在.Net中,它提供了具有不同数量和类型的参数的Action委托的几个实现(相当于Java Consumer功能接口),我期望Java 8提供了一些方法来指定Consumer不同类型的多个参数.

我知道在Java中我们不能定义具有相同名称的不同类型,这些类型在泛型类型参数中有所不同,但是提供多参数会有很好的流畅替代方案Consumer.

有没有简单的方法可以做到这一点,这不需要定义新的功能界面?

c# java lambda java-8 java-stream

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

使用lambdas和stream按值排序映射

我是Java 8的新手,不知道如何使用流和它的排序方法.如果我有如下地图,如何按值对此地图进行排序,以便只使用Java 8获取前10个条目.

HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("a", 10);
        map.put("b", 30);
        map.put("c", 50);
        map.put("d", 40);
        map.put("e", 100);
        map.put("f", 60);
        map.put("g", 110);
        map.put("h", 50);
        map.put("i", 90);
        map.put("k", 70);
        map.put("L", 80);
Run Code Online (Sandbox Code Playgroud)

我知道在Java 8之前,我们可以将这个链接排序:https://stackoverflow.com/a/109389/4315608

java java-8 java-stream

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

将一个系列分成两个不同的系列的最佳方法是什么?

我有一组数字:

 Set<Integer> mySet = [ 1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)

我想把它分成两组赔率和赔率.

我的方法是使用过滤器两次:

Set<Integer> set1 = mySet.stream().filter(y -> y % 2 == 0).collect(Collectors.toSet())
Set<Integer> set2 =mySet.stream().filter(y -> y % 2 != 0).collect(Collectors.toSet())
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个解决方案,因为我经历了整套两次.

有没有更聪明的方法呢?

java filter java-8 data-partitioning java-stream

36
推荐指数
4
解决办法
1963
查看次数

未按计数评估中间流操作

我似乎无法理解 Java 如何将流操作组合到流管道中。

执行以下代码时

public
 static void main(String[] args) {
    StringBuilder sb = new StringBuilder();

    var count = Stream.of(new String[]{"1", "2", "3", "4"})
            .map(sb::append)
            .count();

    System.out.println(count);
    System.out.println(sb.toString());
}
Run Code Online (Sandbox Code Playgroud)

控制台只打印4. 该StringBuilder对象仍然具有值""。

当我添加过滤操作时: filter(s -> true)

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();

    var count = Stream.of(new String[]{"1", "2", "3", "4"})
            .filter(s -> true)
            .map(sb::append)
            .count();

    System.out.println(count);
    System.out.println(sb.toString());
}
Run Code Online (Sandbox Code Playgroud)

输出更改为:

4
1234
Run Code Online (Sandbox Code Playgroud)

这个看似多余的过滤操作如何改变组合流管道的行为?

java java-stream

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

Java流 - 将列表排序到列表的HashMap

假设我有一Dog堂课.

在里面我有一个Map<String,String>和一个值是Breed.

public class Dog {
    String id;
    ...
    public Map<String,String>
}
Run Code Online (Sandbox Code Playgroud)

我想获得Map的ListS:

HashMap<String, List<Dog>> // breed to a List<Dog>
Run Code Online (Sandbox Code Playgroud)

我宁愿使用Stream而不是迭代它.

我该怎么做?

java hashmap java-8 java-stream

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

使用带参数的方法引用

我刚开始学习Java流并遇到了问题.请看下面的例子.这是Node类的一部分:

private Map<String, Node> nodes;

public Optional<Node> child(String name) {
    return Optional.<Node>ofNullable(nodes.get(name));
}

private void findChildren(String name, List<Node> result) {
    child(name).ifPresent(result::add);
    nodes.values().stream()
//          .map(Node::findChildren(name, result))
//          .forEach(Node::findChildren(name, result))
            .forEach(node -> node.findChildren(name, result));
}
Run Code Online (Sandbox Code Playgroud)

我的目的是使用流中每个节点上的名称和结果参数调用#findChildren.我试图使用方法引用Node :: findChildren没有运气.我很欣赏其他与->运营商合作的解决方案.

是否有可能将方法引用与参数一起使用?我喜欢流的想法,我只想让代码更具可读性.

实际上,我认为有一个类似的问题方法引用与我读过的参数,但无法弄清楚如何在我的代码中使用bind2方法.这是唯一的解决方案吗?

java lambda java-stream functional-interface method-reference

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

使用流转换和过滤Java Map

我有一个我想要转换和过滤的Java Map.作为一个简单的例子,假设我想将所有值转换为整数然后删除奇数条目.

Map<String, String> input = new HashMap<>();
input.put("a", "1234");
input.put("b", "2345");
input.put("c", "3456");
input.put("d", "4567");

Map<String, Integer> output = input.entrySet().stream()
        .collect(Collectors.toMap(
                Map.Entry::getKey,
                e -> Integer.parseInt(e.getValue())
        ))
        .entrySet().stream()
        .filter(e -> e.getValue() % 2 == 0)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));


System.out.println(output.toString());
Run Code Online (Sandbox Code Playgroud)

这是正确的,并产生: {a=1234, c=3456}

但是,我不禁想知道是否有办法避免.entrySet().stream()两次打电话.

有没有办法可以执行转换和过滤操作,.collect()最后只调用 一次?

java java-8 java-stream collectors

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

如何将字符串与新的1.8流API连接起来

假设我们有一个简单的方法,它应该连接Person集合的所有名称并返回结果字符串.

public String concantAndReturnNames(final Collection<Person> persons) {
    String result = "";
    for (Person person : persons) {
        result += person.getName();
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用1行的新流API forEach函数编写这段代码?

java java-8 java-stream

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

如何从float []获取流

当我注意到一些奇怪的东西时,我正在学习如何使用java 8流.

Arrays.stream() 有浮动数组的所有方法:

  • Arrays.stream(int[]) : IntStream
  • Arrays.stream(long[]) : LongStream
  • Arrays.stream(double[]) : DoubleStream

类似地,有int,double等的Stream实现,但不是浮点数:

  • IntStream
  • LongStream
  • DoubleStream

这有什么理由吗?

使用浮点流的推荐方法是什么?

java java-8 java-stream

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

Java 8流到文件

假设我有一个java.util.stream.Stream带有一些好toString方法的对象:将这个流写入文件的最短/最优雅的解决方案是什么,每个流元素一行?

对于阅读,有一个很好的Files.lines方法,所以我认为必须有一个对称的方法来写入文件,但找不到. Files.write只需要一个可迭代的.

java java-8 java-stream

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