标签: java-stream

我可以使用Java Stream Collector来实现此行为

我有一个包含以下代码的小方法:

final int year = getYear();
final Carrier carrier = getCarrier();
final CarrierMetrics metrics = new CarrierMetrics(carrier);
repository.getFlightStream(year)
          .filter(flight -> flight.getCarrier().equals(carrier))
          .forEach(flight -> {
             metrics.addFlight(flight);
             printf("%,10d\t%,10d\t%,10d\t%,10d\r",
                    metrics.getTotalFlights(), 
                    metrics.getTotalCancelled(), 
                    metrics.getTotalDiverted(), 
                    metrics.getAirports().size()
             );
          });
Run Code Online (Sandbox Code Playgroud)

希望很明显,我正在做的是在处理流中的每个Flight时累积指标.代码确实有效,但我想知道是否有更好的(更多功能)方法来实现这种行为,可能使用收集器.任何反馈都表示赞赏.

谢谢,

托尼

java java-stream collectors

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

如何计算文本文件中的单词,java 8样式

我正在尝试执行一项任务,首先计算目录中的文件数,然后在每个文件中给出一个单词计数.我得到的文件数量还不错,但是我很难转换一些代码,我的教师从一个频率计数到更简单的字数的类中给了我.此外,我似乎无法找到正确的代码来查看每个文件来计算单词(我试图找到"通用"而不是特定的东西,但我试图使用特定的文本文件测试程序) .这是预期的输出:

Count 11 files:
word length: 1 ==> 80
word length: 2 ==> 321
word length: 3 ==> 643
Run Code Online (Sandbox Code Playgroud)

但是,这是输出的内容:

primes.txt
but
are
sometimes
sense
refrigerator
make
haiku
dont
they
funny
word length: 1 ==> {but=1, are=1, sometimes=1, sense=1, refrigerator=1, make=1, haiku=1, dont=1, they=1, funny=1}

.....

Count 11 files:
Run Code Online (Sandbox Code Playgroud)

我正在使用两个类:WordCount和FileCatch8

字数:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays;
import java.util.Map;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

    /**
     *
     * @author 
     */
    public class WordCount …
Run Code Online (Sandbox Code Playgroud)

java lambda word-count java-8 java-stream

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

Java如何使用流映射返回布尔值

我试图为结果返回一个布尔值.

 public boolean status(List<String> myArray) {
      boolean statusOk = false;
      myArray.stream().forEach(item -> {
         helpFunction(item).map ( x -> {
              statusOk = x.status(); // x.status() returns a boolean
              if (x.status()) { 
                  return true;
              } 
              return false;
          });
      });
}
Run Code Online (Sandbox Code Playgroud)

lambda表达式中使用的抱怨变量应该是final或者有效的final.如果我指定statusOk,那么我无法在循环内分配.如何使用stream()和map()返回布尔变量?

foreach lambda java-8 java-stream

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

如何在功能上处理拆分流

鉴于以下代码,我如何将其简化为单一的功能线?

    // DELETE CSV TEMP FILES
    final Map<Boolean, List<File>> deleteResults = Stream.of(tmpDir.listFiles())
            .filter(tempFile -> tempFile.getName().endsWith(".csv"))
            .collect(Collectors.partitioningBy(File::delete));

    // LOG SUCCESSES AND FAILURES
    deleteResults.entrySet().forEach(entry -> {
        if (entry.getKey() && !entry.getValue().isEmpty()) {
            LOGGER.debug("deleted temporary files, {}",
                    entry.getValue().stream().map(File::getAbsolutePath).collect(Collectors.joining(",")));
        } else if (!entry.getValue().isEmpty()) {
            LOGGER.debug("failed to delete temporary files, {}",
                    entry.getValue().stream().map(File::getAbsolutePath).collect(Collectors.joining(",")));
        }
    });
Run Code Online (Sandbox Code Playgroud)

这是我遇到的一种常见模式,我有一些东西,我想过滤这个流,根据该过滤器创建两个流,然后我可以做一件事流A和另一件事流B.这是一种反模式,还是以某种方式支持?

java functional-programming java-8 java-stream

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

是否有一种优雅的方式将String转换为Stream <Character>

Map<Character, Integer> getMap(String target) { 
return target.chars().boxed()
                      .map(c -> Character.valueOf((char) c.intValue()))
                      .collect(Collectors.groupingBy(
                             c -> c, 
                             Collectors.reducing(0, c -> 1, Integer::sum)
                      ));
    }
Run Code Online (Sandbox Code Playgroud)

这条线target.chars().boxed().map(c -> Character.valueOf((char) c.intValue()))真的很难看,有没有更好的方法呢?

java java-8 java-stream

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

如何使用Java Stream构建列表<Integer>和a和b之间的整数

说我有两个变量:a = 5,b = 8,

而且我要 :

Arrays.asList(5, 6, 7, 8)
Run Code Online (Sandbox Code Playgroud)

我如何使用Java流来获取此信息?

java java-stream

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

如何使用Java API Streams执行此类操作?

我想在流上连续执行以下操作.

1).我想从创建数字流2来n.

我想这可以这样做:IntStream.range(2, n).

2).添加过滤器,只有当此数字不能被已通过此过滤器的任何其他数字整除时,才能使数字更进一步.

我无法实现这样的过滤器.我想我必须创建一个包含an的匿名类,ArrayList我将存储通过此过滤器的所有数字ArrayList.这一切应该看起来像:

IntStream.range(2, n).filter(new IntPredicate() {
        ArrayList<Integer> prev;

        @Override
        public boolean test(int value) {
            if (prev == null) {
                prev = new ArrayList();
                return true;
            }
            for (int i = 0; i < prev.size(); i++) {
                if (value % prev.get(i) == 0) {
                     return false;
                }
            }
            prev.add(value);
            return true;
        }
Run Code Online (Sandbox Code Playgroud)

3).获取Map<Integer, Integer>,其中密钥为数百(即100,200,300,400等),值为每百个中的素数数.所以对于百,100我必须找到[100,199]范围内的素数.

我想非常清楚,在第二步之后,流中只剩下素数.但是我不知道如何执行第三步并且不确定我的第二步的实现.

能帮我解决所有操作吗?

java java-8 java-stream

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

Streams backport编译错误

使用与Java 7 编译器的streamsupportjavac我遇到以下编译错误:

接口java8.util.stream.Stream <T>中的[ERROR]方法映射不能应用于给定类型; 需要[ERROR]:java8.util.function.Function <?超级java.lang.Object,?扩展R>

[ERROR]发现:<anonymous java8.util.function.Function <java.lang.Integer,java.lang.String >> [ERROR]原因:没有类型变量的实例R存在以便参数类型<anonymous java8.util.function.Function <java.lang.Integer,java.lang.String >>符合形式参数类型java8.util.function.Function <?超级java.lang.Object,?扩展R>

我的代码是

List<Object> listSum = RefStreams.iterate(0, new UnaryOperator<Integer>() {
            @Override
            public Integer apply(Integer n) {
                return n+1;
            }
        }).limit(10000).map(new Function<Integer,String>() {
            @Override
            public String apply(Integer n) {
                return String.format("%04d", n);
            }

        }).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我想知道该怎么做以及为什么会出现这个错误?谢谢

java-7 java-stream

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

地图上的流不会保存.map更改

有人可以解释一下为什么第一个代码示例没有保存我在地图上用.map所做的更改,但第二个代码示例呢?

第一个代码示例:

stringIntegerMap.entrySet().stream()
            .map(element -> element.setValue(100));
Run Code Online (Sandbox Code Playgroud)

第二个代码示例:

        stringIntegerMap.entrySet().stream()
            .map(element -> element.setValue(100))
            .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

另外,为什么第二个代码示例只打印值而不是整个元素(键+值)?

java dictionary java-stream

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

并行流在任务完成之前完成

我使用此方法初始化具有默认值的ArrayList:

private ArrayList<Integer> createArrayList(int size, int defaultValue)
{
    ArrayList<Integer> arrayList = new ArrayList<>(size);
    IntStream.range(0, size ).parallel().forEach(i->{arrayList.add(defaultValue);});

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

令人惊讶的是,如果我通过单元测试检查返回数组的大小,它不是固定数字,并且几乎总是小于请求的大小.

如果我删除parallel()它的大小总是按要求.

为什么会这样?

java parallel-processing thread-safety java-stream

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