如何使用流对多个集合检查字符串

时间:2018-10-06 01:35:28

标签: java string collections java-8 java-stream

我正在尝试生成格式为*.*.*.*的特定字符串,可以说QUEUE1.NONE.QUEUE3.NONE。具体来说,这是我的Rabbitmq的路由键,用于根据事件集合确定哪个队列接收特定事件,因此SET1将包含QUEUE1等的事件。

以下是我想出的内容,但我认为它太冗长了,是否有使用流进行此操作的更有效方法?

使用flatmap的问题是,如果它在不同的集合中,我必须返回一个不同的值,而flatmap只是合并集合。

return Optional.ofNullable(eventName).map(event->{
      StringBuffer sb = new StringBuffer()
          .append(Optional.of(event).filter(SET1::contains).map(t -> VALUE1).orElse(SKIP)).append(DELIMITER)
          .append(Optional.of(event).filter(SET2::contains).map(t -> VALUE2).orElse(SKIP)).append(DELIMITER)
          .append(Optional.of(event).filter(SET3::contains).map(t -> VALUE3).orElse(SKIP)).append(DELIMITER)
          .append(Optional.of(event).filter(SET4::contains).map(t -> VALUE4).orElse(SKIP));
      return sb.toString();

2 个答案:

答案 0 :(得分:1)

您可以这样做

List<Set<String>> sets = Arrays.asList(SET1, SET2, SET3, SET4);
List<String> VALUES = Arrays.asList(VALUE1, VALUE2, VALUE3, VALUE4);
String eventDests = IntStream.range(0, 4)
    .mapToObj(i -> sets.get(i).contains(event) ? VALUES.get(i) : SKIP)
    .collect(Collectors.joining(DELIMITER));

答案 1 :(得分:1)

您不必要地使选件复杂化。为什么不保持简单?

...
  {
    test: /\.js$/,
    exclude: /node_modules/,
    use: {
      loader: 'babel-loader',
      options: {
        presets: [
          "@babel/preset-env",
          "@babel/preset-react",
          {
            "plugins": [
              ["relay", {"schema": "./graphql_schema_builds/private/venue/schema.graphql"}],
              "ramda"
            ]
          }
        ]
      }
    }
  },
...