如何在不转换为Java 8数组的情况下检查Stream对象的内容?

时间:2016-09-15 06:36:01

标签: java functional-programming

  

基本上我必须做以下事情:   1)读取CSV输入文件。   2)根据黑名单过滤CSV数据。   3)根据国家名称按升序对输入进行排序。   4)打印未列入黑名单的记录。   CSV文件包含:   ID,国家短,国家   1,AU,澳大利亚   2,CN,中国   3,AU,澳大利亚   4,CN,中国   黑名单文件包含:   AU   J.P   而期望的输出是   2,CN,中国   4,CN,中国

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamProcessing {
    public static void filterCsv(String fileName, String blacklistFile){


         try (Stream<String> stream1 = Files.lines(Paths.get(fileName))) {
             Stream<String> stream2 = Files.lines(Paths.get(blacklistFile));
             Optional<String> hasBlackList = stream1.filter(s->s.contains(stream2)).findFirst();
         } catch (IOException e) {
             e.printStackTrace();
         }
    }   



    public static void main(String args[])
    {
        StreamProcessing sp = new StreamProcessing();
        sp.filterCsv("Data.csv","blacklist.txt");
    }
}

我想从第一个Stream中删除第二个Stream中存在的条目而不将其转换为数组?

2 个答案:

答案 0 :(得分:3)

您只能使用一次流。由于您在评估主文件的每个成员时需要访问黑名单的所有成员,因此必须首先完全使用黑名单流。出于效率原因,请勿转换为数组,而应转换为HashSet

boolean hasBlacklistedWord(String fileName, String blacklistFile) {
    Set<String> blacklist = Files.lines(Paths.get(blacklistFile)).collect(toSet());
    return Files.lines(Paths.get(fileName)).anyMatch(s -> blacklist.contains(s));
}

答案 1 :(得分:1)

不幸的是,您不能多次使用流,因此检查每行的黑名单流的代码将失败。最简单的解决方案是将黑名单存储在一个集合中,然后根据它检查每一行。

security.yml