MENU

はてなブログCSSテーマと見出しに適応するスタイルシートの重複について

はてなブログをカスタマイズする際に見出しテーマを決めると思いますがあらかじめ、見出しテーマを決めた後に

見出し要素をカスタムするとデザインが重複する場合があります。言葉だとイメージつきにくいので画像で・・・・


f:id:saigonitoride:20170831131016j:plain

私は公式テーマの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;
}

こうすることで↓になり重複を防ぐことができます。


f:id:saigonitoride:20170831131823j:plain

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()メソッドについて

<String, Integer, String, TreeMap<Integer, String>> Collector<String, ?, TreeMap<Integer, String>> java.util.stream.Collectors.toMap(Function<? super String, ? extends Integer> keyMapper, Function<? super String, ? extends String> valueMapper, BinaryOperator mergeFunction, Supplier<TreeMap<Integer, String>> mapSupplier)
 
 

とても複雑な構造です汗
 
Eclipsejavadocから直接コピペしたんので一瞬引数の表示の仕方に戸惑いました・・・
toMap()についてはjdcから理解するのをやめました・・・w
めんどくさいんで汗
 
ストリームをMapにするメソッドなのですが・・・・
キーが重複するとエラーになるそうで・・・・
このように、String::length, s -> s,(s1,s2) -> s1 + ":" +  s2、と引数を三つとってやることで第三引数に重複キーのマージ処理を指定することができるそうで・・・・
 
ここからが本題なのですが・・・・
Stream<String> stream2 = Stream.of("nao","akko","ami","aaa");のように重複が2つ以上あったらどうなるんかなーと思ったら
 
{3=nao : ami : aaa, 4=akko}と返りました。
 
さすが公式SE8API感服です。
しっかりと、3=nao : ami : aaaとなり3つの重複を確認^^
 
メソッドの中がどのような操作になっているかすごい気になりますが・・・・