Java的。将字符串流转换为其他类型

时间:2018-04-23 11:47:27

标签: javafx stream

我有课

public class ListItem {
    private final String text;
    private final BooleanProperty isSelected = new SimpleBooleanProperty();

    public BooleanProperty selectedProperty() {
        return isSelected ;
    }

    public final boolean isSelected() {
        return selectedProperty().get();
    }

    public final void setSelected(boolean isSelected) {
        selectedProperty().set(isSelected);
    }

    public ListItem(String text) {
        this.text = text ;
    }

    public String getText() {
        return text;
    }

    @Override
    public String toString() {
        return getText(); 
    }
}

在其他课程中我有这个

private ObservableList<ListItem> ListData = FXCollections.observableArrayList();

代码中的一些地方我这样做:

Stream<String> stream = Files.lines(Paths.get(FILENAME), Charset.forName("windows-1251") );     
ListData = stream
  .filter(line -> line.startsWith("File"))
  .map(line -> line.substring(line.indexOf("=") + 1, line.length()))
  .collect(Collectors.toCollection(????));

我必须写什么?将字符串流值转换为ListItem值的位置?这种转换是可能的吗?

2 个答案:

答案 0 :(得分:1)

由于您已经创建了ObservableList,因此您只需使用forEach将每个项目添加到ListData即可。此外,您需要使用ListItem的构造函数将流的每个元素包装在ListItem中:

stream
      .filter(line -> line.startsWith("File"))
      .map(line -> line.substring(line.indexOf("=") + 1)) // there's also a version of substring that only takes the start index
      .map(ListItem::new) // equivalent to .map(line -> new ListItem(line))
      .forEach(ListData::add);

如果列表可能不为空,则需要在ListData.clear();之前。

答案 1 :(得分:0)

collectionFactory的{​​{1}}参数会创建一个Collectors.toCollection(),然后Collection为该流的每个成员调用add()

您需要将流中的字符串转换为ListItem s - 为此使用其他map,然后您可以使用Collectors.toList()