小编Rav*_*ala的帖子

如何使用Java流API过滤地图?

Map<Integer, String> map = new HashMap<>();
map.put(1, "f");
map.put(2, "i");
map.put(3, "a");
map.put(4, "c");....etc
Run Code Online (Sandbox Code Playgroud)

现在我有一个列表:

List<Integer> picks = {1,3}
Run Code Online (Sandbox Code Playgroud)

我想取回一个字符串列表,即映射中与“ pick”列表中找到的键值匹配的值。因此,我希望取回{“ f”,“ a”}作为结果。有没有一种方法可以使用Java流api优雅地做到这一点?

当有一个值时,我就是这样:

map.entrySet().stream()
            .filter(entry -> "a".equals(entry.getValue()))
            .map(entry -> entry.getValue())
            .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

但是,当要过滤的键/小贴士列表变得越来越困难时。

java lambda java-8 java-stream collectors

6
推荐指数
3
解决办法
235
查看次数

使用Java Streams对内部Maps进行分组

我有以下结构:

Map<String,Map<String,Map<String,Integer>>>
Run Code Online (Sandbox Code Playgroud)

现在,我想忽略“第一级地图”,并根据“第二级地图”的键来分组(并总结)“第三级地图”。要澄清一些示例条目:

Entry 1: ["1"["A"[[a,1];[b,2]];"B"[[a,3];[c,1]]]]
Entry 2: ["2"["A"[[b,2];[c,1]];"B"[[a,5];[b,0]]]]
Run Code Online (Sandbox Code Playgroud)

所需的输出:

Entry 1: ["A"[[a,1];[b,4];[c,1]]]
Entry 4: ["B"[[a,8];[b,0];[c,1]]]
Run Code Online (Sandbox Code Playgroud)

因此,为此,我首先根据我的2级密钥(“ A”,“ B”)对我的Entry-stream进行分组,如果没有其他操作,则最终得到如下结构:

Map<String,List<Entry<String,Map<String,Integer>>>>
Run Code Online (Sandbox Code Playgroud)

这就是我被困住的地方。我该如何Map<String,Integer>从我的条目列表中获取我的信息(对于每个外部地图,具体而言)?

我假设可以保证需要使用以下简单代码:

        initialMap.values().stream()
                            .flatMap(m -> m.entrySet().stream())
                            .collect(Collectors.groupingBy(Map.Entry::getKey));
Run Code Online (Sandbox Code Playgroud)

摘要:

如何变换Map<String,Map<String,Map<String,Integer>>>Map<String<Map<String,Integer>>不顾最外层Map,分组我最里面Maps按照我的第二个,图层- Keys和总结我Integer的-值key最里面的-值Map。此外,最外面的每个第二级Maps都有一个,因此每个都会有相同的第二级。在3 -级别- s时,可以无法在其他3-级别-发现Key-Value-PairMapKeysKeysetKeysMaps

java lambda java-8 java-stream collectors

5
推荐指数
0
解决办法
125
查看次数

使用 java 8 在列表中查找另一个列表中不存在的元素

我有 2 个列表。要求是根据条件过滤掉list1中不在list2中的元素。

  Class Fighter
  {
    String name;
    String address;
  }     
  List<Fighter> pairs1 = new ArrayList();
    pairs1.add(new Fighter("a", "a"));
    pairs1.add(new Fighter("b", "a"));

    List<Fighter> pairs2 = new ArrayList();
    pairs2.add(new Fighter("a", "c"));
    pairs2.add(new Fighter("a", "d"));
    Set<Fighter> finalValues = new HashSet<>();


    finalValues = pairs1.stream().filter(firstList -> 
   pairs2.stream().noneMatch(secondList -> 
   firstList.getName().equals(secondList.getName())
            && firstList.getName().equals(secondList.getName()))).collect(Collectors.toSet());

    System.out.println(finalValues);
Run Code Online (Sandbox Code Playgroud)

预期输出:a=a, b=a

说明:list1 中的元素不在 list2 中

上面的代码没有给出预期的输出。请让我知道如何更正上述流代码以获得输出

java lambda java-8 java-stream

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

iText动态地为PDF封面中的占位符添加值

我有以下封面.我需要为被许可人添加值,日期并在框中填写另一个给定的文本.如何使用iText完成此操作.任何帮助表示赞赏.在此输入图像描述

java pdf pdf-generation itext

4
推荐指数
1
解决办法
2105
查看次数

SpringData - MongoDB 按给定顺序按 ID 获取对象

我有一个这样的用例。我在我的 Mongo DB 中有问题并且有一个 CRUD 微服务。在那里,我公开了一种 API 方法,可以通过查询参数给出的 ID 列表来获取问题。让我们说为了简单起见,用户给出/api/questions?id=2, id=7, id=4, id = 5

然后我需要以完全相同的顺序返回问题列表,就像这样

questions: [
    {
       id: 2,
       prompt: "prompt one",
       ...
    },
    {
        id: 7,
        prompt: "prompt two",
        ...
    },
    {
        id: 4,
        ...
    },
    {
        id: 5
        ...
    }
]
Run Code Online (Sandbox Code Playgroud)

但请注意,这既不是 ASC 也不是 DESC,而是可以是任意顺序,例如 /api/questions?id=2, id=7, id=4, id=5

我正在使用org.springframework.data.mongodb.repository.MongoRepository我的DAO班级。目前,我正在通过基于 spring-data 的存储库获取数据后在我的服务层内进行排序。该解决方案有效。但我更愿意在 DAO 存储库级别本身完成此排序,因为它成本更低,并且不会在服务层为我的业务逻辑增加不必要的复杂性。相反,我可以仅将责任委托给数据库,假设它更有能力通过更多优化来完成这些事情。

Mongo 文档结构如下所示。 在此处输入图片说明

我可以使用弹簧数据实现这一点吗?如果是这样,如何完成那件事?

java spring mongodb spring-data spring-boot

4
推荐指数
1
解决办法
6894
查看次数

枚举的通用过滤器

以下是我的课

public final class Test {
enum Animal {DOG,CAT};
enum COLOR {RED,YELLOW};

class Meaningless {
    String animal,color;
}
public void filter(List<Meaningless> meaninglesses){
    meaninglesses.stream()
            .filter(meaningless -> {
                try {
                    Animal.valueOf(meaningless.animal);
                    return true;
                }catch(Exception e){
                    return false;
                }
            })
            .filter(meaningless -> {
                try {
                    COLOR.valueOf(meaningless.color);
                    return true;
                }catch(Exception e){
                    return false;
                }
            })
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

}

filter方法的2次迭代实质上过滤掉了无效的枚举类型。如何从中删除重复的代码?该检查应该足够通用,以便isValidEnumenum引入新的检查时不必更改。

理想情况下,我想做类似的事情

 meaninglesses.stream()
            .filter(meaningless -> isValidEnum(meaningless.animal,Animal.class))
            .filter(meaningless -> isValidEnum(meaningless.color,COLOR.class))
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

4
推荐指数
1
解决办法
92
查看次数

删除xml中的父元素,同时使用xslt保留它的子元素

我想转换以下xml,

<pets>
    <Pet>
        <category>
            <id>4</id>
            <name>Lions</name>
        </category>
        <id>9</id>
        <name>Lion 3</name>
        <photoUrls>
            <photoUrl>url1</photoUrl>
            <photoUrl>url2</photoUrl>
        </photoUrls>
        <status>available</status>
        <tags>
            <tag>
                <id>1</id>
                <name>tag3</name>
            </tag>
            <tag>
                <id>2</id>
                <name>tag4</name>
            </tag>
        </tags>
    </Pet>
</pets>
Run Code Online (Sandbox Code Playgroud)

转换成这种 xml 格式。

<pets>
    <Pet>
        <category>
            <id>4</id>
            <name>Lions</name>
        </category>
        <id>9</id>
        <name>Lion 3</name>
        <photoUrl>url1</photoUrl>
        <photoUrl>url2</photoUrl>
        <status>available</status>
        <tag>
            <id>1</id>
            <name>tag3</name>
        </tag>
        <tag>
            <id>2</id>
            <name>tag4</name>
        </tag>
    </Pet>
</pets>
Run Code Online (Sandbox Code Playgroud)

我尝试按如下方式编写模板,但它删除了父元素及其子元素。

<xsl:template match="photoUrls"/>
Run Code Online (Sandbox Code Playgroud)

这如何在 xslt 中完成。任何帮助表示赞赏。

xml xslt xslt-2.0 xslt-1.0

3
推荐指数
1
解决办法
4873
查看次数

按Stream API的频率对集合进行排序

大家好,使用streams时,有一个问题。我有一个工作表,我想按其中出现字符的频率进行排序:

List<String> frequency = new ArrayList<>();
        Collections.addAll(frequency, "gg", "ss", "gg", "boy", "girls", "girls", "gg", "boy", "aa", "aa");
Run Code Online (Sandbox Code Playgroud)

我写了这个方法:

return words.stream().limit(limit).map(String::toLowerCase)
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
                    .entrySet().stream()
                    .map(entry -> new Pair<>(entry.getKey(), entry.getValue()))
                    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但是已经显示的答案是不正确的,字符串a完全丢失,字符串gg是一个元素,而boy是一个元素

ss=1
gg=2
girls=2
boy=1
Run Code Online (Sandbox Code Playgroud)

而且我不知道如何按发生频率对它们进行排序。结果应该是这样的:

gg=3
aa=2
boy=2
girls=2
ss=1
Run Code Online (Sandbox Code Playgroud)

如何改善呢?

java lambda java-8 java-stream

3
推荐指数
1
解决办法
124
查看次数

如何将Optional &lt;Object&gt;转换为Optional &lt;String&gt;

我在Java 11中有此代码

Object a = getObjectOrNullIfNotAvailable();
String value = a==null ? null : a.toString();
Run Code Online (Sandbox Code Playgroud)

我想使用Optional编写此代码,我能想到的最好的方法是。我没有尝试运行它,但我怀疑它会起作用

Optional<Object> oa = Optional.ofNullable(getObjectOrNullIfNotAvailable());
Optional<String> oas = oa.map(a -> a.toString());
String value = oas.orElse(null);
Run Code Online (Sandbox Code Playgroud)

除了在可选组件上运行map之外,我还有什么想法可以实现此目的。我希望有类似下面的代码,但这行不通

Optional<Object> oa = Optional.ofNullable(getObjectOrNullIfNotAvailable());
String value = oa.ifPresentOrElse(a -> a.toString(), a -> null);
Run Code Online (Sandbox Code Playgroud)

java optional java-8 java-11

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

RestAssured - JsonPath 根据给定的过滤条件从对象数组中过滤匹配对象的属性

我正在使用放心为我的微服务编写集成测试。我有一个像这样的 Json 有效负载,它是从它返回的。

{
   "sessionQuestions":[
      {
         "id":1272,
         "sessionId":1146,
         "questionId":"1002",
      },
      {
         "id":1273,
         "sessionId":1146,
         "questionId":"1004",
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

我需要根据 QuestionId 值查找会话问题的 id。然后我需要在我的断言中比较它们。给定 QuestionId 值,我很难从 sessionQuestion 中获取 id。我正在使用 JsonPath 来完成这件事。这是我的 Json 路径表达式。

new JsonPath(response).get("$.sessionQuestions[?(@.questionId=='1002')].id");
Run Code Online (Sandbox Code Playgroud)

这会引发错误。

java.lang.IllegalArgumentException: Invalid JSON expression:
Script1.groovy: 1: expecting EOF, found '[' @ line 1, column 45.
   nRootObject.$.sessionQuestions[?(@.quest
                                 ^

1 error

   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Run Code Online (Sandbox Code Playgroud)

我在此在线评估器中尝试了相同的 Json 路径表达式,效果很好。我在用json-path-2.9.0.jar

我在这里做错了什么?非常感谢任何帮助。

java json jsonpath rest-assured rest-assured-jsonpath

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

使用Java8过滤器比较两个Integer列表

我有以下问题。有两个大小相等的整数列表a和b。现在,我想比较两个列表值在相同的索引处。我的函数返回带有2个值的列表。第一个值是列表a中更大的值计数。第二个值是列表b中更大的值计数。如果两者的值相同,则计数不增加。

我可以一些想法如何使用流/过滤器/谓词在java8中实现

我已经在较旧的Java版本中重新运行了该方法。

    static List<Integer> compareTriplets(List<Integer> a, List<Integer> b) {
        List<Integer> list = new ArrayList<Integer>();
        int asize = 0;
        int bsize = 0;
        for (int i = 0; i <b.size();i++) {
            if(a.get(i) > b.get(i)) {
                asize++;
            }else if(a.get(i) < b.get(i)) {
                bsize++;
            }
        }
        list.add(asize);
        list.add(bsize);
        return list;
    }
Run Code Online (Sandbox Code Playgroud)

例1。输入:a = 5 6 7 b = 3 6 10输出:1 1例如2.输入:a = 17 28 30 b = 99 16 8输出:2 1

java lambda stream java-8 java-stream

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

Java 8+流中是否有等同功能?

我正在尝试根据条件过滤列表。是否有其他替代方法可以中断Java 8流以停止过滤?

举个例子:假设我有以下列表。

List<String> list = Arrays.asList("Foo","Food" ,"Fine","Far","Bar","Ford","Flower","Fire");

list.stream()
        .filter(str -> str.startsWith("F")) //break when str doesn't start with F
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我希望从头开始以“ F”开头的所有字符串,一旦找到不以“ F”开头的字符串,我想停止过滤。没有流,我将执行以下操作:

List<String> result = new ArrayList<>();
for(String s : list){
    if(s.startsWith("F")){
        result.add(s);
    }
    else{
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在信息流中使用“中断”?

java lambda break java-8 java-stream

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

在两个列表中创建匹配元素的映射

我有两个清单。我想创建一个映射里面会有真正的匹配部件及虚假的唯一一个在Java 8
EG
输入 -

列表1 = [A,B,C,D]
列表2 = [B,C,Y,Z]

输出 -

地图

A,假

B,真

C真

D,假

我的代码:

Map<String,Boolean> map = new HashMap<>();
            for(String var1 : list1) {
                boolean value;
                if (CollectionUtils.isNotEmpty(list2)) {
                    Optional<String> valueOptional = list2.stream()
                            .filter(e1 -> e1.equalsIgnoreCase(var1))
                            .findAny();
                    value = valueOptional.isPresent();
                    map.put(var1, value);
                }
            }
Run Code Online (Sandbox Code Playgroud)

java collections lambda java-8 java-stream

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