はてなブログCSSテーマと見出しに適応するスタイルシートの重複について
はてなブログをカスタマイズする際に見出しテーマを決めると思いますがあらかじめ、見出しテーマを決めた後に
見出し要素をカスタムするとデザインが重複する場合があります。言葉だとイメージつきにくいので画像で・・・・
私は公式テーマのHandwritingを使用しているためデフォルトで見出しにスタイルシートが適応されています。
↓これがCSSにあたるデフォルトテーマの適応
@import "/css/theme/handwriting/handwriting.css";
でこれを直したいんですが
解決策として適応されているスタイルシートを初期化するという手があげられます。
例えばh3タグに初期化したければ
/*あらかじめある背景の初期化*/ .entry-content h3, .entry-content h3::before, .entry-content h3::after { background: none; border: none; border-radius: 0; }
こうすることで↓になり重複を防ぐことができます。
Collectors.groupingBy()メソッドについて
キーと値を対応させて管理させたいときによく使うのがCollector.groupingBy()ですが・・
これがなかなか手ごたえがありました。(一回全部書いて投稿したら送信エラーで全部ブログ消えたので
はてなブログのほうが手応えあったのは内緒・・・・・^^#)
Collector.groupingBy()は要するに指定された条件に従ってグルーピングを行う。←意味不明w
とりあえず構文はこうなってます
Collectors.groupingBy()
static <T,K> Collector<T,?,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier) static <T,K,A,D> Collector<T,?,Map<K,D>> groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream) static <T,K,D,A,M extends Map<K,D>> groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream) Collector<T,?,M>
・・・・・・・・^^;
まぁまぁ気をとりなおして
こういうのは実際に書いたほうがわかりやすいからね!
Stream<String> stream1 = Stream.of("belle","akko","ami","bob","nao"); Map<String,List<String>) map = stream.collect(Collectors.groupingBy(S -> s.substring(0,1))); System.out.println(map); ///{a=[akko,ami],b=[belle,bob],n=[nao]} Stream<String> stream1 = Stream.of("belle","akko","ami","bob","nao"); Map<String,Set<String>) map1 = stream.collect(Collectors.groupingBy(S -> s.substring(0,1),Collectors.toSet())); System.out.println(map1); ///{a=[akko,ami],b=[belle,bob],n=[nao]} ///Map<String,List<String>がMap<String,Set<String>になる Stream<String> stream1 = Stream.of("belle","akko","ami","bob","nao"); Map<String,String) map1 = stream.collect(Collectors.groupingBy(S -> s.substring(0,1),Collectors.joining())); System.out.println(map1); ///{a=akkoami,b=bellebob,n=nao} ///Map<String,List<String>がMap<String,String>になる Stream<String> stream1 = Stream.of("belle","akko","ami","bob","nao"); Map<String,String) map1 = stream.collect(Collectors.groupingBy(S -> s.substring(0,1),TreeMap :: new,Collectors.joining())); System.out.println(map1); System.out.println(map1.getClass()); ///{a=akkoami,b=bellebob,n=nao} ///TreeMap型になる
Collectors.joining()
Collectors.toSet()
とかは完全にストリームのcollect()methodのためのメタ要員ですね・・・・
Javaの公式の偉い方たちが考えてるんで我々下々にはその中身を理解する必要はなく
とりあえず終端でcollect()が使いたかったら引数にCollectors.joining()とかぶっこんどけってことですよね。
自分のやりたい機能がなかったら自分で作れってこと
まぁ汎用性が高いものはすでにだれかが作ってるだろうし
所詮プログラムなんてこの程度なんだなって思った
デフォルトで提供されている関数型インターフェースについて
ストリームAPIを使う際にあまりにもデフォルトで提供されている関数型インターフェ
ースが使われているためそれぞれのふるまいについて書いておこうかなと・・・・
そもそも関数型インターフェースとは
抽象メソッドが一つしかないインタフェースなのですが・・
例えば
public class Main{ public static void main(String[] args){ String val = "a"; Function f= (val) -> { System.out.println(val); }; f.test("b"); } interface Function { void test(String val); }
この場合Functionインターフェースがそれに当たりますね。
また、Javaのutilパッケージにはあらかじめ関数型インターフェースが提供されており
インポートすることで使えるようになりますが・・・
最初はそんなもん自分で作るからいらないじゃんとか思ってたけど・・・・
ストリームAPIとかJavaの公式APIのほうでばんばん使うからあらかじめ提供されなきゃあかんかーと思いました・・・・w
肝心のデフォルトで提供されている関数型インターフェースですが・・・
表にしてみました
関数型インターフェース | 抽象メソッド |
---|---|
Function<T,R> | R apply(T u) |
BitFunction<T,U,R> | R apply(T t, U u) |
Consumer<T> | void accept(T t) |
Predicate<T> | boolean test(T t) |
BiPredicate<T,U> | boolean test(T t,U u) |
Supplier<T> | T get() |
UnaryOperator<T> | T apply(T t) |
BinaryOprerator<T> | T apply(T t1,T t2) |
たぶん中身はこんなかんじかなぁ?
interface Function<T,R>{
R apply(T t)
}
使い方については・・・
public class Main{ public static void main(String[] args){ String val = "a"; Predicate p= val -> val.equals(a) boolean f = p.test(val); System.out.println(f); } }
これでtrueがかえってくるはず・・・・
結構書くの疲れました・・・・w
ではでは ٩(๑•̀ω•́๑)۶
Collectors.toMap()の重複キー3つ以上のマージ処理について
public static void main(String[] args) {
Stream<String> stream1 = Stream.of("nao","akko","ami");
Map<Integer, String> map1 =stream1.collect(Collectors.toMap(String::length, s -> s,(s1,s2) -> s1 + ":" + s2));
System.out.println(map1);
System.out.println(map1.getClass());
Stream<String> stream2 = Stream.of("nao","akko","ami","aaa");
Map<Integer, String> map2 = stream2.collect(Collectors.toMap(String::length, s -> s, (s1,s2) -> s1 + " : " + s2, TreeMap::new));
System.out.println(map2);
System.out.println(map2.getClass()); }
collect()メソッドについて
<TreeMap<Integer, String>, Object> TreeMap<Integer, String> java.util.stream.Stream.collect(Collector<? super String, Object, TreeMap<Integer, String>> collector)
toMap()メソッドについて