标签: java-stream

Java 8 句子流

I\xe2\x80\x99d 喜欢使用 Java 8 流来获取字符串流(例如从纯文本文件中读取)并生成句子流。我认为句子可以跨越界限。

\n\n

例如,我想从:

\n\n
"This is the", "first sentence.  This is the", "second sentence."\n
Run Code Online (Sandbox Code Playgroud)\n\n

到:

\n\n
"This is the first sentence.", "This is the second sentence."\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以看到它 \xe2\x80\x99s 可以得到句子部分的流,如下所示:

\n\n
Pattern p = Pattern.compile("\\\\.");\nStream<String> lines\n   = Stream.of("This is the", "first sentence.  This is the", "second sentence.");\n\nStream<String> result = lines.flatMap(s -> p.splitAsStream(s));\n
Run Code Online (Sandbox Code Playgroud)\n\n

但后来我\xe2\x80\x99m 不确定如何生成一个流来将片段连接成句子。我想以一种惰性的方式执行此操作,以便仅读取原始流中需要的内容。有任何想法吗?

\n

java java-8 java-stream

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

在 Java 流中使用 printf

我是使用 lambda 和流的新手。我正在尝试打印一个已排序并删除重复项并格式化的 ArrayList。我知道以下方法会起作用:

list.stream().distinct().forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)

这将产生 ADFJKLXZ 或我列表中的任何随机字符的输出。但是,我希望输出看起来像 A、D、F、J、K、L、X、Z

我已经尝试过这个:

list.stream().distinct().forEach(System.out::printf("%s, ", ));
Run Code Online (Sandbox Code Playgroud)

我想我可能仍然对 :: 为什么上面的代码不起作用以及我该如何修复它有一些困惑?

java printf java-8 java-stream

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

java 8,List&lt;Employee&gt; 部门地图和地址列表

我有一个类似 classe User{ String Department; 的类;字符串地址;我有用户列表,我可以使用 java 8 Stream/map/collect 获得以下输出吗

List<User> userList=getUserList();

Map<String,List<String>> userAddressMap=new HashMap<String,List<String>>();

for(User user : userList){

   List<String> addressList=userAddressMap.get(user.getDepartment());

   if(addressList==null){
        userAddressMap.put(user.getDepartment(),addressList);
   }

   addressList.add(user.getAddress);
}
Run Code Online (Sandbox Code Playgroud)

java collections java-8 java-stream collectors

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

如何将流收集到 CopyOnWriteArrayList 中

我收到“不兼容的类型,必需:CopyOnWriteArrayList,找到:对象”,内容如下。我正在使用 IntelliJ 2016.1.1。

CopyOnWriteArrayList<Foo> l = fields.stream()
                                    .distinct()
                                    .collect(toCollection(CopyOnWriteArrayList::new));
Run Code Online (Sandbox Code Playgroud)

intellij-idea java-8 java-stream collectors

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

使用 Java 8 搜索字谜

我必须编写程序,该程序应该读取字谜文件并显示单词+他的字谜。Txt文件很大,使用扫描仪后,listOfWords大小为:25000。

输出示例:

word anagram1 anagram2 anagram3 ...
word2 anagram1 anagram2...
Run Code Online (Sandbox Code Playgroud)

我有代码,它可以工作,但速度很慢:

  private static List<String> listOfWords = new ArrayList<String>();
  private static List<ArrayList<String>> allAnagrams = new ArrayList<ArrayList<String>>();

  public static void main(String[] args) throws Exception {
    URL url = new URL("www.xxx.pl/textFile.txt");
    Scanner scanner = new Scanner(url.openStream());
    while (scanner.hasNext()) {
      String nextToken = scanner.next();
      listOfWords.add(nextToken);
    }
    scanner.close();

    while (listOfWords.isEmpty() == false) {
      ArrayList<String> anagramy = new ArrayList<String>();
      String wzor = listOfWords.remove(0);
      anagramy.add(wzor);
      char[] ch = wzor.toCharArray();
      Arrays.sort(ch);
      for (int i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

java anagram java-8 java-stream

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

如何使用 Java 8 流和过滤器过滤嵌套循环?

我有两个简单的 POJO:

public class Parent {
    String name;
    List<Child> children = new ArrayList<>();
    void addChild(Integer age) { children.add(new Child(age)); }
}

public class Child {
    Integer age;
}
Run Code Online (Sandbox Code Playgroud)

然后我生成一些数据,为父级 100 个子级添加:

List<Parent> parentList = new ArrayList<>();

Parent first = new Parent("first");
for (int i = 0; i < 100; ++i) { first.addChild(i); }
parentList.add(first);
Run Code Online (Sandbox Code Playgroud)

我的目标是消除所有十岁以下的儿童:

parentList.stream().forEach(parent -> {
    parent.setChildren(getChildrenOlderThan(parent));
});

List<Child> getChildrenOlderThan10(Parent parent) {
    return parent.getChildren().stream()
        .filter(child -> child.getAge() > 10)
        .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

最后我列出了十岁以上的孩子。但我不想编写一个单独的方法 getChildrenOlderThan。

如何仅使用单个流让所有列出十岁以上儿童的父母?

java java-8 java-stream

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

为什么我使用 foreach 总是得到 ArrayIndexOutOfBoundsException

我使用流将旧代码更改为新代码。但是当我启动tomcat时它不断出现

错误 osweb.servlet.DispatcherServlet - 上下文初始化失败 org.springframework.beans.factory.BeanDefinitionStoreException:无法读取候选组件类:文件 xxx(我的 FilePath)嵌套异常是 java.lang.ArrayIndexOutOfBoundsException:25091”

谁能告诉我是什么原因导致这个错误?我真的很感谢你的帮助。

/*old*/
for(String key:paramMap.keySet()){
    if(key.startsWith("NUMBER_OF_") ){
        String value = request.getParameter(key);
        if(value!=null && !value.equals("")){
            br.append(key.replace("NUMBER_OF_", "")).append(" = ")
                .append('"').append(value).append('"').append(" and ");
        }
    }
}

/*new*/
new ArrayList<>(paramMap.keySet()).stream().filter(p -> p.startsWith("NUMBER_OF_")).forEach(
    o ->{
        String value = request.getParameter(o);
        if(value!=null && !value.equals("")){
            br.append(o.replace("NUMBER_OF_", "")).append(" = ")
                .append('"').append(value).append('"').append(" and ");
        }
    });
Run Code Online (Sandbox Code Playgroud)

整个堆栈跟踪:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [D:\apache-tomcat-7.0.61\webapps\web\WEB-INF\classes\com\ais\brm\web\controllers\system\metadic\MetaDicManageController.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:260)
org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1419)
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1409)
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184)
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140)
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) …
Run Code Online (Sandbox Code Playgroud)

foreach indexoutofboundsexception java-stream

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

Java 流到 String[] 数组

我正在读取结构如下的 CSV 文件:

1;Miller Hame; 1,2,3,4,5.....; 1232323;
Run Code Online (Sandbox Code Playgroud)

我必须把它分成String[],我可以处理每一行,每一行"Part"

到目前为止我的代码:

Stream<String> input = java.nio.file.Files.lines(java.nio.file.Paths.get("data.csv"));

String[] lines = input.skip(1)
        .map(s->s.split(";"))
        .toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

事实上我正在得到java.lang.ArrayStoreException。

(是的,这是为了家庭作业,但我不想要整个解决方案,只想要工作的一小部分。)

java java-8 java-stream

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

流:通过供应商和累加器收集

我一直在尝试使用Stream 的收集方法,将列表转换为 HashMap。我使用下面的代码作为参考:

String result = list.parallelStream().collect(StringBuilder::new,
            (response, element) -> response.append(" ").append(element),
            (response1, response2) -> response1.append(",").append(response2.toString()))
            .toString();
Run Code Online (Sandbox Code Playgroud)

当我在 eclipse 中编写以下不完整的语句并在 ? 处执行ctrl+操作时space

Map<String,Choice> map1=  list1.stream().collect(()-> new HashMap<String,Choice>(), 
        (r,s) -> r.?,(r,s) -> r.putAll(s));
Run Code Online (Sandbox Code Playgroud)

考虑到使用 StringBuilder 的代码片段,我的期望是,累加器函数的第一个参数应该是 HashMap,因为我已使用 HashMap::new 作为供应商函数。根据这种理解,eclipse应该建议我使用HashMap的方法,但事实并非如此。

然而,这似乎工作正常

list1.stream().collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
Run Code Online (Sandbox Code Playgroud)

已经提到了Java 8 Int Stream Collect with StringBuilder,但是,这方面运气不佳。

java java-8 java-stream

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

Java 8 流分组通过使用比较器

我有兴趣将以下代码变成更简洁的代码:

\n\n
    final String[] strings = {"a", "B", "A", "\xc3\xa1", "\xc3\x81"};\n    final Collator collator = Collator.getInstance(Locale.FRANCE);\n    collator.setStrength(Collator.PRIMARY);\n\n    final Map<String, Set<String>> m = new TreeMap<>(collator);\n    for (String s : strings) {\n        m.compute(s, (k, v) -> {\n            if (v == null)\n                v = new TreeSet<String>();\n            v.add(s);\n            return v;\n        });\n    }\n\n    final Collection<Set<String>> requiredResult = m.values();\n\n    requiredResult.forEach(System.out::println);\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
[A, a, \xc3\x81, \xc3\xa1]\n[B]\n
Run Code Online (Sandbox Code Playgroud)\n\n

基本上,它的作用是通过忽略大小写和变音标记来将字母视为相等,并将这些“相等”字母分组在一起。(顺便说一句,我知道大多数语言如果变音符号不同,则不认为字母相等;这只是一个人为的示例。)

\n\n

我正在考虑通过使用流来缩短它。然而,groupingBy收集器要求将事物按字母分组。我这里没有具体的字母,只有一个Comparator(整理者)。

\n

java java-stream

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