结合子串的流

时间:2017-07-01 11:01:21

标签: java substring java-stream

我有以下代码迭代require_once 'library/HTMLPurifier.auto.php'; $config = HTMLPurifier_Config::createDefault(); $config->set('Core.DefinitionCache', null); $config->set('HTML.DefinitionID', 'enduser-customize.html tutorial'); $config->set('HTML.DefinitionRev', 1); $config->set('Cache.DefinitionImpl', null); $config->set('Filter.YouTube', true); $purifier = new HTMLPurifier($config); $dirty_html = $_POST['content']; $clean_html = $purifier->purify($dirty_html); DateTimeFormatter的{​​{1}}模式组合。

我的问题是,在这种情况下,是否存在使用Java Streams的惯用方法(或者更为惯用的方式)?

"E".."EEEE"

输出

"M".."MMMM"

4 个答案:

答案 0 :(得分:1)

您正在使用IntStream 驱动字符串。这是一种方法,这是另外两种方式:

static Stream<String> substrings(String str) {
    return str.length() == 1 ? Stream.of(str) :
            Stream.concat(Stream.of(str), substrings(str.substring(1)));
}

这会递归地创建Stream,而另一种方式如下:

static Stream<String> substrings2(String str) {
    return Stream.iterate(str, s -> s.substring(1)).limit(str.length());
}

这会将给定的函数应用于上一个结果。在创建无限流时,您必须使用limit

我稍微修改了您的main方法,以避免一次map操作:

substrings("EEEE")
    .flatMap(e -> substrings("MMMM").map(m -> e + " " + m + " d"))
    .forEach(DateTimeFormattingStackOverflow::printDateTime);

我真的不知道上面的方法是否比你的方式或多或少是惯用的,但是如果你问我,最常用的方法是使用嵌套循环:

String e = "EEEE";
String m = "MMMM";

for (int i = 0; i < e.length(); i++)
    for (int j = 0; j < m.length(); j++)
        printDateTime(e.substring(i) + " " + m.substring(j) + " d");

这可能会被翻译成Java 8,如下所示:

IntStream.range(0, e.length()).boxed()
    .flatMap(i -> IntStream.range(0, m.length())
        .mapToObj(j -> e.substring(i) + " " + m.substring(j) + " d"))
    .forEach(DateTimeFormattingStackOverflow::printDateTime);

答案 1 :(得分:0)

我会改变生成字符重复运行的方式:不是手动构造最长的字符串,而是迭代它的前缀,我会使用Collection.nCopies构建运行,如下所示:

static Stream<String> repeatedRuns(String c, int start, int end) {
    return IntStream
        .rangeClosed(start, end)
        .mapToObj(len -> 
            Collections.nCopies(len, c).stream().collect(Collectors.joining(""))
        );
}

然后,您将substrings("EEEE")替换为repeatedRuns("E", 1, 4)

Demo.

答案 2 :(得分:0)

我不知道这是否更为惯用,但我会将其简化为一种方法(可能只是我......)

 public static Stream<String> combinations(String first, String second, String d, LocalDateTime dateTime) {

        Stream<String> s = IntStream.range(0, first.length())
                .mapToObj(i -> first.substring(0, i + 1))
                .flatMap(x -> IntStream.range(0, second.length())
                        .mapToObj(i -> second.substring(0, i + 1))
                        .map(m -> String.join(" ", x, m))
                        .map(res -> res + " d")
                        .peek(System.out::print)
                        .map(DateTimeFormatter::ofPattern)
                        .map(dtf -> dtf.format(dateTime)));
        return s;
    }

   combinations("EEEE", "MMMM", " d", LocalDateTime.now()).forEach(x -> System.out.println(", " + x));

答案 3 :(得分:0)

我根本不会流过子串。它足以流式传输代表16种组合的东西,并在一次操作中构造格式字符串:

require 'phpmailer/PHPMailerAutoload.php';

class Mailz extends PHPMailer {
    public $From     = 'noreply@example.com';
    public $FromName = 'Examplemail';
    public $Host     = 'mail.example.com';
    public $SMTPAuth = true;
    public $Username = 'noreply@example.com';
    public $Password = '123example';
    public $SMTPSecure = 'ssl';
    public $Port = 465;
    public $Priority    = 1;
    public $CharSet     = 'UTF-8';
    public $Encoding    = '8bit';
    public $Content = 'text/html';

    public function send() {
        return parent::send();
    }

/*
 * welcome email
 */

public static function sendWelcome($email,$password) {

   $message = str_replace(
        array(
        '[body]',
          '[first_name]',
          '[email_address]',
          '[password]'

        ),
        array(
        $body = 'Lorem ipsum yadadada',
        $email_address = $email,
        $password,
        ),
        file_get_contents('welcome.html')
    );

    $this->Subject = 'Subject Line!';
    $this->Body    = $message;

    if(!$this->send()) {
        echo 'Message could not be sent.';
        echo 'Mailer Error: ' . $this->ErrorInfo;
    } else {
        echo 'Message has been sent';
    }


    }
}


$sendemail = new Mailz();
$sendemail->sendWelcome('recipient@gmail.com','P4$$w0rd');

这些是四次四次组合的事实使得计算符合廉价位算术的条件,但原则上,任何 n × m 组合都可以通过从0流式传输到 n × m 并使用Stream<String> patterns = IntStream.range(0, 16).map(i -> 15-i) .mapToObj(i -> "EEEE".substring(i>>2)+" "+"MMMM".substring(i&3)+" d"); i/n来选择元素(比如执行i%n操作)。前面的substring步骤只是颠倒顺序以使其与原始代码匹配;如果订单无关紧要,你可以省略它。