我有以下代码迭代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"
答案 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)
。
答案 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
步骤只是颠倒顺序以使其与原始代码匹配;如果订单无关紧要,你可以省略它。