Как я могу перебрать строку и изменить некоторые поля, используя функцию Java 8 (Stream) - PullRequest
1 голос
/ 26 октября 2019

Я хочу выполнить несколько операций над одной строкой. Мне нужно получить строку и извлечь разные подстроки, используя разделитель (";"), затем снова извлечь разные подстроки, используя разделитель (":"), если поле соответствует, обновите поля и, наконец, соедините их сисходное состояние, такое что: firstName: Saroj; электронная почта: saroj@gmail.com; eaOldId; город:; center: com.test.Center :: 0/69 будет превращаться в: firstName: xxxxxx; электронная почта: xxxxx@xxxx.com; eaOldId; город:; центр: com.test.Center :: 0/69

Основная потребностьпроблема в том, что мне нужно изменить некоторые из моих обязательных полей [здесь 'firstName', 'email'] на ['xxxxxx', 'xxxxx@xxx.com']. Я хочу зашифровать конфиденциальные данные.

Я попробовал приведенный ниже традиционный подход в основном классе

String shortData = "firstName:Saroj;email:saroj@gmail.com;eaOldId;city:;center:com.test.Center::0/69";
Map<String, List<String>> props = getProperties();
if(props.get("modelClasses").contains("com.test.Member")) {
   List<String> modelFields = props.get(getModelClass());
   List<String> shortDta = Stream.of(shortData.split(";")).map (elem -> new String(elem)).collect(Collectors.toList());
   StringBuilder sb = new StringBuilder();
   for(String data  : shortDta){
      String[] dta = data.split(":");
      if(dta.length>2){
          dta = data.split("=", 2);
      }
      if(dta.length == 1){
         sb.append(data).append(";");
         continue;
      }
      String key = dta[0];
      if(modelFields.stream().anyMatch(d -> d.equalsIgnoreCase(key))){
           String email = props.get("email").toString().replace("[", "").replace("]", "");
           String pattern = props.get("commonPattern").toString().replace("[", "").replace("]", "");
           sb.append(dta[0]).append(":").append(dta[0].equals("email") ? email : pattern).append(";");
      } else {
        sb.append(dta[0]).append(":;");
      }
   }
   if (sb.length() > 0) {
       sb.delete(sb.length() - 1, sb.length());
   }

Ниже приведены данные, которые я 'm извлекается из файла свойств [здесь выполняется преобразование в требуемый объект вручную]

private Map<String, List<String>> getProperties(){
        Map<String, List<String>> props = new HashMap<>();
        List<String> str1 = new ArrayList<>();
        str1.add("firstName");
        str1.add("email");
        List<String> str2 = new ArrayList<>();
        str2.add("com.test.Member");
        str2.add("com.test.Contact");
        props.put("modelClasses", str2);
        props.put("com.test.Member", str1);
        props.put("com.test.Contact", str1);
        props.put("commonPattern", Arrays.asList("xxxxxxx"));
        props.put("email", Arrays.asList("xxxx@xxxx.com"));
        return props;
 }

Если вы заметили, что в строке присутствует несколько [: ], например center: com.test.Center :: 0/69 Мне нужно позаботиться и об этом.

Могу ли я сделать то же самое, используя Java 8 Streams. Любая помощь высоко ценится. Спасибо !!!!!

1 Ответ

3 голосов
/ 26 октября 2019

Я мог бы просто использовать String#replaceAll здесь для опции регулярного выражения в одну строку:

String input = "firstName:Saroj;email:saroj@gmail.com;eaOldId;city:;center:com.test.Center::0/69";
System.out.println(input);
input = input.replaceAll("(?<=\\bfirstName:)[^;]+", "xxxxxx");
input = input.replaceAll("(?<=\\bemail:)[^@]+@[^;]+(\\.[^;]+)", "xxxxx@xxx$1");
System.out.println(input);

Это печатает:

firstName:Saroj;email:saroj@gmail.com;eaOldId;city:;center:com.test.Center::0/69
firstName:xxxxxx;email:xxxxx@xxx.com;eaOldId;city:;center:com.test.Center::0/69

Примечание: я мог бы рекомендовать полностью сделать электронную почту замаскированной,то есть используйте xxxxx@xxx.xxx, чтобы избежать утечки даже любой информации об истинном адресе электронной почты пользователя. Показывая такие вещи, как домен и / или субдомены, вы можете упростить обнаружение этой информации.

...