首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Java8函数获得结果的最佳方法是什么?

通过Java8函数获得结果的最佳方法是什么?
EN

Stack Overflow用户
提问于 2019-05-31 14:11:37
回答 4查看 115关注 0票数 2

我需要过滤元素,然后根据特定的列进行排序。张贴,我将需要找到唯一的条目,基于组合的列。由于它是文件处理,管道(X)被用作分隔符来表示列值。

代码语言:javascript
复制
String s1= "12|Thor|Asgaurd|1000000|Avenger|Active"
String s2= "234|Iron man|New York|9999999|Avenger|Active"
String s3= "420|Loki|Asgaurd|||Inactive"
String s4= "12|Thor|Asgaurd Bank|1000000|Avenger HQ|Active"

数据首先需要根据活动/非活动状态进行过滤。然后,需要根据第四列对其进行排序。最后,需要通过合并列1、2、3来保持唯一性。

预期产出=

代码语言:javascript
复制
"234|Iron man|New York|9999999|Avenger|Active"
"12|Thor|Asgaurd|1000000|Avenger|Active"
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-31 15:01:58

首先,您应该创建一个表示字符串数据的对象。就像这样:

代码语言:javascript
复制
public class MyObject {
    private int id;
    private String name;
    private String location;
    private Integer value;
    private String category;
    private String state;

    public MyObject(String entry) {
        String[] parts = entry.split("\\|");
        if (parts.length != 6) {
            throw new IllegalArgumentException("entry has not 6 parts");
        }
        id = Integer.parseInt(parts[0]);
        name = parts[1];
        location = parts[2];
        try {
            value = Integer.parseInt(parts[3]);
        } catch (NumberFormatException ignored) {
        }
        category = parts[4];
        state = parts[5];
    }

    // getters

    @Override
    public String toString() {
        return String.join("|", String.valueOf(id), name, location, String.valueOf(value), category, state);
    }
}

这样,您就可以从String创建一个对象流,然后创建到过滤器、排序和不同的操作:

代码语言:javascript
复制
Collection<MyObject> result = Stream.of(s1, s2, s3, s4)
        .map(MyObject::new)
        .filter(o -> "Active".equals(o.getState()))
        .sorted(Comparator.comparing(MyObject::getValue).reversed())
        .collect(Collectors.toMap(o -> Arrays.asList(o.getId(), o.getName()), 
                Function.identity(), (o1, o2) -> o1, LinkedHashMap::new))
        .values();

result.forEach(System.out::println);

在映射操作之后,您按照状态筛选值,并按列4对它们进行排序(在我的例子中是value)。最后,您将收集映射中用于不同操作的所有值。将需要区分的所有值添加到Arrays.asList()中。作为值,映射接受所有原始值(Function.identity())。对于重复项,我们保留第一个值((o1, o2) -> o1),并且使用LinkedHashMap来保持项目的顺序。最后,我们只使用地图的值。

如果您需要List而不是Collection,请使用new ArrayList(result)

其结果将是:

代码语言:javascript
复制
234|Iron man|New York|9999999|Avenger|Active
12|Thor|Asgaurd|1000000|Avenger|Active
票数 0
EN

Stack Overflow用户

发布于 2019-05-31 14:47:45

创建模型类并解析字符串是可行的方法,但如果出于某些原因,您不想这样做,您可以这样做:

代码语言:javascript
复制
import java.util.Comparator;
import java.util.stream.Collectors;
import java.util.stream.Stream;

List<String> result = Stream.of(s1, s2, s3, s4)
            .filter(s -> s.split("\\|")[5].equals("Active"))
            .sorted(Comparator.comparing(e -> e.split("\\|")[4]))
            .collect(Collectors.toList());
票数 1
EN

Stack Overflow用户

发布于 2019-05-31 14:43:36

看起来,当一切都是字符串时,您似乎无法进行过滤。尝尝这个,

创建一个可以容纳列的新模型类。例如:

代码语言:javascript
复制
class MyData{
 private String name;
 private String city;
 private String distance;
 private String organization;
 private String status;
 //And create Getter Setter method for all above fields.
}

现在来到您的主要课程,您可以在那里玩您的代码的东西。

代码语言:javascript
复制
Map<MyData> map = new HashMap<MyData>();
 MyData myData = new MyData();
 myData.setName("Thor");
 myData.setCity("Asgaurd");
 myData.setDistance("1000000");
 myData.setOrganization("Avenger");
 myData.setStatus("Active");
 map.put(12, myData);
//Same thing for all other data (note: use the loop for data insertion in map)

Map<String, MyData> sorted = map.entrySet().stream().sorted(comparingByValue()).collect(toMap(e -> e.getKey(), e -> e.getValue().getName(), (e1, e2) -> e2,LinkedHashMap::new));

System.out.println("map after sorting by values: " + sorted);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56396708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档