当前位置: 首页 > 知识库问答 >
问题:

java流在两个不同的过滤器后生成映射

鲁龙野
2023-03-14

它应该会返回一张地图。这个映射的键应该是字符串“transaction”和“transition”,映射的值应该是SNP对象的列表。“过渡”指的是两个阶段之间的变化

我应该如何制作这两个过滤器?

public class StreamAssignment {

    private static final List<Snp> SNP_COLLECTION = Snp.getSnpCollection();
    private static final String[] SNP_DATA = new String[14];

    static {
        SNP_DATA[0] = "100273;A;G;0.0123";
        SNP_DATA[1] = "100275;A;C;0.00323";
        SNP_DATA[2] = "117807;T;G;0.1915";
        SNP_DATA[3] = "162889;C;G;8.72E-4";
        SNP_DATA[4] = "190199;T;C;0.1019";
        SNP_DATA[5] = "277614;A;G;0.0168";
        SNP_DATA[6] = "372778;C;A;4.24E-5";
        SNP_DATA[7] = "417752;A;G;1.8474E-10";
        SNP_DATA[8] = "478808;A;G;1.535689E-8";
        SNP_DATA[9] = "556920;T;G;0.1097";
        SNP_DATA[10] = "676255;G;C;0.0016672";
        SNP_DATA[11] = "667280;A;G;0.00287";
        SNP_DATA[12] = "719876;C;A;0.006649";
        SNP_DATA[13] = "828771;A;C;0.097706";
    }

    public static Map<String, List<Snp>> getTransversionsTransitions() {
        Map<String, List<Snp>> result;
        result = SNP_COLLECTION.stream().filter();


        return null;
    }
}

SNP类

package nl.bioinf.appdesign.d_streams_lambdas;

import java.util.ArrayList;
import java.util.List;

public class Snp {
    private final long position;
    private final char reference;
    private final char alternative;
    private final double minorAlleleFrequency;

    public Snp(long position, char reference, char alternative, double minorAlleleFrequency) {
        this.position = position;
        this.reference = reference;
        this.alternative = alternative;
        this.minorAlleleFrequency = minorAlleleFrequency;
    }

    public long getPosition() {
        return position;
    }

    public char getReference() {
        return reference;
    }

    public char getAlternative() {
        return alternative;
    }

    public double getMinorAlleleFrequency() {
        return minorAlleleFrequency;
    }

    @Override
    public String toString() {
        return "Snp{" +
                "position=" + position +
                ", reference=" + reference +
                ", alternative=" + alternative +
                ", minorAlleleFrequency=" + minorAlleleFrequency +
                '}';
    }

    public final static List<Snp> getSnpCollection() {
        List<Snp> snps = new ArrayList<>();
        snps.add(new Snp(100273, 'A', 'G', 0.0123));
        snps.add(new Snp(100275, 'A', 'C', 0.00323));
        snps.add(new Snp(117807, 'T', 'G', 0.1915));
        snps.add(new Snp(162889, 'C', 'G', 0.000872));
        snps.add(new Snp(190199, 'T', 'C', 0.1019));
        snps.add(new Snp(277614, 'A', 'G', 0.0168));
        snps.add(new Snp(372778, 'C', 'A', 0.0000424));
        snps.add(new Snp(417752, 'A', 'G', 1.8474e-10));
        snps.add(new Snp(478808, 'A', 'G', 1.535689e-8));
        snps.add(new Snp(556920, 'T', 'G', 0.1097));
        snps.add(new Snp(676255, 'G', 'C', 1.6672e-3));
        snps.add(new Snp(667280, 'A', 'G', 0.00287));
        snps.add(new Snp(719876, 'C', 'A', 0.006649));
        snps.add(new Snp(828771, 'A', 'C', 0.097706));
        return snps;
    }
}

共有3个答案

公冶经纶
2023-03-14

你可以在你的两个角色reference

import java.util.function.BiFunction;

....


public static Map<String, List<Snp>> getTransversionsTransitions() {
    BiFunction<Character,Character,String> func =
            (a,b) -> (""+a+b).matches("AG|GA|CT|TC") ? "Transitions":"Transversions";
    return SNP_COLLECTION.stream()
            .collect(Collectors.groupingBy(snp -> func.apply(snp.getReference(),snp.getAlternative())));
}
萧修永
2023-03-14

在重新检查您的代码并阅读您的解释后,我假设Snp类的参考替代属性将作为示例

这就是我想出的代码。如果我误解了什么,请在评论中告诉我。

public static Map<String, List<Snp>> getTransversionsTransitions() {
    Map<String, List<Snp>> result = new HashMap<>();

    result.put("Transitions", SNP_COLLECTION.stream()
            .filter(snp -> (snp.getReference() == 'A' && snp.getAlternative() == 'G') || (snp.getReference() == 'C' && snp.getAlternative() == 'T'))
            .collect(Collectors.toList()));

    result.put("Transversions", SNP_COLLECTION.stream()
            .filter(snp -> (snp.getReference() == 'A' && snp.getAlternative() == 'C') || (snp.getReference() == 'G' && snp.getAlternative() == 'T')|| (snp.getReference() == 'C' && snp.getAlternative() == 'G'))
            .collect(Collectors.toList()));

    return result;
}

这只是检查输出是否符合预期的主要步骤

public static void main(String[] args) {
    Map<String, List<Snp>> result = getTransversionsTransitions();
    for(String key: result.keySet()){
        System.out.printf("%s => %s%n", key, result.get(key));
    }
}
穆鸿飞
2023-03-14

因为您的Snp类不包含关于它是转换还是转换的信息,所以您需要一个包装类。我将省略它,但它只需要一个String-type属性、Snp-Snp属性和一个工厂方法(我们称之为parse)。

result = SNP_COLLECTION.stream()
        // do your filtering based on string values
        .map(SnpWrapper::parse) // String to Snp conversion
        // do your filtering based on Snp values
        .collect(Collectors.groupingBy(
                Wrapper::getType,
                Collectors.mapping(Wrapper::getSnp, Collectors.toList())
        ));

编辑:实际上不需要包装。你只需要提供一个实用的方法。它可以放在Snp中,也可以作为当前类中的私有方法。让我们假设它是后者,它的名称为getSnpType

result = SNP_COLLECTION.stream()
        // do your filtering based on string values
        .map(Snp::parse) // or whatever you have for String -> Snp
        // do your filtering based on Snp values
        .collect(Collectors.groupingBy(StreamAssignment::getSnpType));
 类似资料:
  • null 或用java

  • 我试图用两个不同的过滤器来配置spring security。我想要的是有一些将由一个过滤器处理的网址,和一些将由其他过滤器处理的网址。这是我想到的设置: 过滤器看起来像这样: 过滤器1 : 过滤器2 : 问题是这两个过滤器都是在一个链中为每个请求调用的。我提出的任何请求,它首先通过一个过滤器,然后通过另一个,而不是仅仅通过一个。 我该怎么解决这个问题? 提前感谢。

  • 我尝试根据过滤最后一个元素的过滤器引发异常: 这样我就可以分辨出为什么在人流中没有发现任何人。是因为年龄还是因为没有人养宠物。 我只看到一个选项,并用两个流来实现它? 或者我能做些什么来把所有的事情都集中在一个流里?

  • 问题内容: 我的问题很简单。我想在Elastica的一个查询中组合两个过滤器,一个filter_bool和一个filter_range。该代码是 我不能在$ elasticaQuery中将两个过滤器放在一起。请给我任何帮助! 谢谢! 问题答案: 为什么不将范围过滤器添加为过滤器中的另一个术语: 您需要在布尔过滤器中使用过滤器,而不是查询。注意我已经使用而不是您正在使用的范围查询。 另外,您知道您使

  • 我想要找到合适的正则表达式匹配的行数。输入是通过Java Stream插入的日志文件。我想对这个流应用多个过滤器,但每隔一段时间计算一次。

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?