标签: java-8

如何以一种好的方式在Java中的同一列表中查找对象对

在里面

我有一个ArrayList不同的对象.我试图在一个条件的基础上搜索相同的列表对象对.如果我找到了正确的对,我创建一个新对象并将其添加到新列表中.但是我想避免在objectA与objectB配对时创建一个对象对,而objectB与objectA配对.

直到现在我才找到一个好方法.

我试过的想法

2 for循环

for(Object objectA : objectList){
    for(Object objectB : objectList){
        if(condition){
            // create new object
            // add to list
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:我需要对已匹配的对进行标记,否则将导致我想避免的同一对的两个创建对象.它有效,但可能不是最好的解决方案?

迭代器

就像有两个forloops的版本一样,我使用了一个迭代器并从列表中删除了已匹配的对象对.工作,但似乎不好?

Java8 forEach&removeIf

objectList.stream().forEach(posA -> {
    objectList.removeIf(posB -> condition);
});
Run Code Online (Sandbox Code Playgroud)

问题:我什么时候创建对象对象...?

哪个是最好的主意 - 或者是否有更好的解决方案我没有得到?

java list arraylist java-8

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

在内存方面使用枚举对许多常量有效吗?

我有一个看起来像这样的类:

public class MessageBuilder{

  private enum MsgCodes{

    CODE_1("some string"),
    CODE_2("another string"),
    CODE_3("you get the idea");

    private String msg;

    MsgCodes(String msg){
      this.msg = msg;
    }

    private String text(){
      return msg;
    }
  }

  private MessageBuilder(){
    //prevents initialization outside the class
  }

  //Gives synchronized behaviour to initialization without enforcing it into getInstance()
  private static class Loader{
    static MessageBuilder INSTANCE = new MessageBuilder();
  }

  public static MessageBuilder getInstance(){
    return Loader.INSTANCE;
  }

  public String buildMessage(String[] codes){
    String res = "";
    for(String code : codes){
      res …
Run Code Online (Sandbox Code Playgroud)

java enums constants java-8

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

使用Java流从集合中查找最小和最大数量

下面是代码片段,正如预期的那样,在编译时失败.

我真正想要做的是使用流找到所有列表中的最小值和最大值.

public class Delete {

   public static void main(String[] args) {

      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 677, 0);
      List<Integer> list1 = Arrays.asList(11, 12, 23, 34, 25, 77);
      List<Integer> list2 = Arrays.asList(12, 21, 30, 14, 25, 67);
      List<Integer> list3 = Arrays.asList(41, 25, 37, 84, 95, 7);

      List<List<Integer>> largeList = Arrays.asList(list, list1, list2, list3);

      System.out.println(largeList.stream().max(Integer::compare).get());
      System.out.println(largeList.stream().min(Integer::compare).get());
   }

}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

将元素从Stream添加到现有List的更好方法是什么?

我必须编写一些代码,将Java 8 Stream的内容多次添加到List中,而且我很难弄清楚最好的方法是什么.基于我在SO上阅读的内容(主要是这个问题:如何将Java8流的元素添加到现有List中)和其他地方,我将其缩小到以下选项:

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Accumulator<S, T> {


    private final Function<S, T> transformation;
    private final List<T> internalList = new ArrayList<T>();

    public Accumulator(Function<S, T> transformation) {
        this.transformation = transformation;
    }

    public void option1(List<S> newBatch) {
        internalList.addAll(newBatch.stream().map(transformation).collect(Collectors.toList()));
    }

    public void option2(List<S> newBatch) {
        newBatch.stream().map(transformation).forEach(internalList::add);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是,对于同一个实例,将多次调用这些方法Accumulator.选择是在使用中间列表和Collection.addAll()在流外部调用一次还是collection.add()从流中为每个元素调用之间.

我倾向于更喜欢选项2,这更符合函数式编程的精神,并且避免创建中间列表,但是,当n很大时调用addAll()而不是调用add()n次可能有好处.

两种选择中的一种明显优于另一种吗?

编辑:JB Nizet有一个非常酷的答案,延迟转换,直到所有批次都添加.在我的情况下,需要直接执行转换.

PS:在我的示例代码中,我用作transformation占位符,用于需要在流上执行的任何操作

java collections java-8 java-stream

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

如何使用java8在字符串中查找第一个重复和不重复的字符

我有一个有效的示例,使用java 7在字符串中查找第一个重复和不重复的字符

以下是工作示例

public class FindFirstRepeatedAndNonRepeatedChar {
    static void firstRepeatedNonRepeatedChar(String inputString) {

        HashMap<Character, Integer> charCountMap = new HashMap<Character, Integer>();

        char[] strArray = inputString.toCharArray();

        for (char c : strArray) {
            if (charCountMap.containsKey(c)) {
                charCountMap.put(c, charCountMap.get(c) + 1);
            } else {
                charCountMap.put(c, 1);
            }
        }

        for (char c : strArray) {
            if (charCountMap.get(c) == 1) {
                System.out.println("First Non-Repeated Character In '" + inputString + "' is '" + c + "'");

                break;
            }
        }

        for (char c : strArray) {
            if (charCountMap.get(c) …
Run Code Online (Sandbox Code Playgroud)

java java-8

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

Java 8将多个文件平面映射到行

给定一组文件名:

bigList = Arrays.stream(files)
    .flatMap(file - > {
        try {
            return Files.lines(Paths.get(path + SEPARATOR + file));
        } catch (IOException e) {
            LOGGER.log(Level.WARNING, "No se puede encontrar el archivo " + file);
        }
        return null;
    })
    .filter(str - > str.startsWith("ABC"))
    .distinct()
    .map(Mapper::mapToObj)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

当我使用传统的for循环时(而不是Arrays.stream(..).flatMap(..)),这会返回不同的输出

for (String file: files) {
    bigList.addAll(Files.lines(Paths.get(path + SEPARATOR + file))
        .filter(str - > str.startsWith("ABC"))
        .distinct()
        .map(Mapper::mapToObj)
        .collect(Collectors.toList()));
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

提前致谢

干杯

java-8 java-stream

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

基于TableView中所选项的JavaFX布尔绑定

我试图Button根据a中所选行的属性值的聚合启用JavaFX TableView.以下是演示此问题的示例应用程序:

package test;

import java.util.Random;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.MultipleSelectionModel;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(final String[] args) throws Exception {
        launch(args);
    }

    private static class Row {
        private final BooleanProperty myProp;
        public Row(final boolean value) {
            myProp = new SimpleBooleanProperty(value);
        }
        public BooleanProperty propProperty() { return myProp; }
    }

    @Override …
Run Code Online (Sandbox Code Playgroud)

java javafx java-8 javafx-8

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

使用外部属性运行Jar文件

我有jar文件,我想与特定的属性文件一起运行.我正在运行以下命令来执行该jar

java –jar –DApp.config.file=local.properties App.jar
Run Code Online (Sandbox Code Playgroud)

使用此命令,我收到以下错误

Could not load properties from class path resource [local.properties]: class path resource [local.properties] cannot be opened because it does not exist
Run Code Online (Sandbox Code Playgroud)

基于我到目前为止所读到的内容,如果你传递-jar,那么你不必担心$ CLASSPATH.我在这里错过了什么吗?

PS - local.properties和jar文件在同一目录中.

java jvm jar java-8

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

如何将列表分发到子列表中,保持元素的原始顺序?

如何将列表拆分为给定数量的列表,按顺序获取元素并将它们分发到子列表(因此不对列表进行分区)?

我想尽可能"好"(使用Java 8功能或番石榴或类似的东西).

  • 示例列表: [1 2 3 4 5 6 7]
  • 应分为3: [1 4 7] [2 5] [3 6]
  • 应分为2: [1 3 5 7] [2 4 6]

java split list java-8

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

Java是否计划使用默认方法(java8)替代抽象类?

Java有计划default method替代 Abstract Class吗?我找不到使用默认方法而不是抽象的真实案例?

java abstract-class interface java-8 default-method

2
推荐指数
4
解决办法
625
查看次数