在java8 Collectors.toMap中,keyMapper值应来自另一个常量映射的键

时间:2018-05-26 18:09:21

标签: java json spring-boot spring-data-jpa

我的情况如下:

在我的项目中,我使用带弹簧数据的弹簧启动。所以现在我必须在各个领域过滤我的主要实体。在这样的帖子调用中,字段及其值在请求体中以json格式出现。

{
  "filters": [
    {
      "field": "ownerUiids",
      "terms": "1,2"
    },
    {
      "field": "key",
      "terms": "a"
    },
    {
       and many more
    }
  ],
  "sortBy": "wwww"
}

我有一个pojo类将此json转换为java.and,该pojo类包含来自json的字段列表。

我将此列表转换为字段映射,其值为键和值,如:

Map<String,String> filterMap =
            request.getFilters().stream().collect(Collectors.toMap(Filter::getField,
                    Filter::getTerms));

所以我的问题从这里开始,json中的字段名称与db中的列名不匹配,因此在制作条件api时,实际的列名不会出现在查询中。

为了解决这个问题,我使用key作为json字段创建了常量静态映射,value是与该字段对应的实际列名,如:

public static final Map<String, String> myMap = Collections.unmodifiableMap(
            new HashMap<String, String>() {{
                put("ownerUiids", "ownerUIID");
                put("key", "keyValue");
            }});

所以当我在制作filterMap时,我需要键是常量myMap的值,而不是Filter :: getField,如果我可以做myMap.getKey(Filter :: getField)。但是现在我无法做到这一点。

Map<String,String> filterMap =
                request.getFilters().stream().collect(Collectors.toMap(myMap.getKey(Filter::getField),
                        Filter::getTerms));

在这件事之后,我有我的列名称及其值,这是我当前的需求。并解决了我的问题。

请帮我解决这个问题。或者如果你有比这更好的方法,那么这也是可观的。

2 个答案:

答案 0 :(得分:2)

你不能像这样使用方法参考。试试这个:

Map<String,String> filterMap =
       request.getFilters().stream()
              .collect(Collectors.toMap(f -> myMap.get(f.getField()),
                    Filter::getTerms));

答案 1 :(得分:0)

因为创建dto类和格式化原始数据

1:在dto类中创建dto和write converter方法

Python 3.6.5
[GCC 4.3.4 [gcc-4_3-branch revision 152973]] on linux
Type "help", "copyright", "credits" or "license" for more information.
Traceback (most recent call last):
  File "/var/lib/spark/python/pyspark/shell.py", line 31, in <module>
    from pyspark import SparkConf
  File "/var/lib/spark/python/pyspark/__init__.py", line 110, in <module>
    from pyspark.sql import SQLContext, HiveContext, Row
  File "/var/lib/spark/python/pyspark/sql/__init__.py", line 45, in <module>
    from pyspark.sql.types import Row
  File "/var/lib/spark/python/pyspark/sql/types.py", line 27, in <module>
    import ctypes
  File "Python-3.6.5_suse/lib/python3.6/ctypes/__init__.py", line 7, in <module>
    from _ctypes import Union, Structure, Array
ImportError: libffi.so.4: cannot open shared object file: No such file or directory

2:现在创建地图

List<Dto> dtos = request.getFilters().stream().map(Dto::convert).collect(Collectors.toList())