我有一个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)
问题:我什么时候创建对象对象...?
哪个是最好的主意 - 或者是否有更好的解决方案我没有得到?
我有一个看起来像这样的类:
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) 下面是代码片段,正如预期的那样,在编译时失败.
我真正想要做的是使用流找到所有列表中的最小值和最大值.
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 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 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) 给定一组文件名:
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)
为什么会这样?
提前致谢
干杯
我试图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) 我有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 8功能或番石榴或类似的东西).
[1 2 3 4 5 6 7][1 4 7] [2 5] [3 6][1 3 5 7] [2 4 6]Java有计划default method替代 Abstract Class吗?我找不到使用默认方法而不是抽象的真实案例?